有时候要获取一个关键接口时,本地没有就需要各种调用了,虽然方法有点暴力,但没辙时还是很有效果的,稍作总结
一、C调用C++
common/libs/audio/audio_hw.c //再audio hal层调用C++的函数
typedef void* FMPcmHandler;
extern FMPcmHandler fm_pcm_open(int samplerate,int channels,int bytes,int required_channel);
FMPcmHandler fm_pcm_open_l(struct pcm_config fm_record_config,int bytes,int required_channel)
{
return fm_pcm_open(fm_record_config.rate,fm_record_config.channels,bytes,required_channel);
}
common/libs/audio/Android.mk //把函数定义的源文件和库编译过来
LOCAL_C_INCLUDES += \
device/sprd/partner/trout/fmhal
LOCAL_SHARED_LIBRARIES := \
libengclient libvbeffect libvbpga libFMHalSource
partner/trout/fmhal/FMHalSource.h //要调用函数的声明和定义
extern "C"{
typedef void * FMPcmHandler;
FMPcmHandler fm_pcm_open(int samplerate,int channels,int bytes,int required_channel);
}
partner/trout/fmhal/FMHalSource.cpp
FMPcmHandler fm_pcm_open(int samplerate,int channels,int bytes,int required_channel)
{
//realize this function
// TO DO ...
}
二、C++调用C:
没找到跨模块的合适的函数,这里是同模块内C++调用C;个人觉得如果是跨模块的话就把要用到的库share过来就行
再要用的模块内编译进这个C函数(这里在同一目录,FMHalSource.cpp调用tinyalsa_util.c)
device/sprd/partner/trout/fmhal/Android.mk
LOCAL_SRC_FILES := FMHalSource.cpp RingBuffer.cpp tinyalsa_util.c
定义:
device/sprd/partner/trout/fmhal/tinyalsa_util.c
int get_snd_card_number(const char *card_name)
{
int i = 0;
char cur_name[64] = {0};
//loop search card number
for (i = 0; i < 32; i++) {
get_snd_card_name(i, &cur_name[0]);
if (strcmp(cur_name, card_name) == 0) {
ALOGI("Search Completed, cur_name is %s, card_num=%d", cur_name, i);
return i;
}
}
ALOGE("There is no one found.");
return -1;
}
调用:
device/sprd/partner/trout/fmhal/FMHalSource.cpp
extern "C"
{
#define FM_CARD_NAME "general-i2s"
int get_snd_card_number(const char *card_name);
}
3、kernel里调用
3.1 普通的全局变量使用
全局变量定义:
kernel\drivers\net\wireless\bcmdhd\Dhd_common.c
bool ap_fw_loaded = FALSE;
其他地方调用:
kernel\drivers\net\wireless\bcmdhd\Wl_android.c
extern bool ap_fw_loaded;
kernel/driver/mmc/core/core.h //这个头文件的声明貌似可以没有
void mmc_power_off(struct mmc_host *host);//这个头文件的声明貌似可以没有
全局函数的定义:
kernel/driver/mmc/core/core.c
void mmc_power_off(struct mmc_host *host)
{
//realize this function
// TO DO ...
}
其他地方调用:
kernel\drivers\mmc\host\Sc8830.c
extern void mmc_power_off(struct mmc_host* mmc);
3.2 kernel与模块之间调用
3.2.1 模块调用kernel的全局变量或者函数, 用EXPORT_SYMBOL即可
变量的定义:
kernel\arch\arm\mach-sc\Dhd_adapter.c
struct mmc_host *gMmc;
EXPORT_SYMBOL_GPL(gMmc);
调用:
kernel\drivers\net\wireless\bcmdhd\Bcmsdh_sdmmc_linux.c
extern struct mmc_host *gMmc;
函数的定义:
kernel\drivers\mmc\host\Sc8830.c
int sdhci_device_attach(int on)
{
struct mmc_host *mmc = NULL;
if(sdhci_host_g && (sdhci_host_g->mmc)){
mmc = sdhci_host_g->mmc;
if(mmc->card){
sdhci_host_g->dev_attached = on;
if(!on){
mmc_power_off(mmc);
}else{
mmc_power_up(mmc);
}
}else{
/* no devices */
sdhci_host_g->dev_attached = 0;
return -1;
}
return 0;
}
return 0;
}
EXPORT_SYMBOL_GPL(sdhci_device_attach);
函数的调用
kernel\drivers\net\wireless\bcmdhd\Wl_android.c
extern int sdhci_device_attach(int on);
3.2.2 内核调用模块
内核无法调用模块的全局变量
内核可以调用模块的全局函数 (android 10,kernel 4.9)
test.h 里可如下定义,然后C++里实现定义,C里调用。都包含这个test.h 即可;然后可能需要检查下库
#ifdef __cplusplus
extern "C" {
#endif
// Callback function for verity status
typedef void (*fs_mgr_verity_state_callback)(struct fstab_rec *fstab,
const char *mount_point, int mode, int status);
struct fstab *fs_mgr_read_fstab(const char *fstab_path);
void fs_mgr_free_fstab(struct fstab *fstab);
#ifdef __cplusplus
}
#endif