函数及变量跨模块调用

来源:互联网 发布:广州本科网络教育 编辑:程序博客网 时间:2024/06/07 02:38
有时候要获取一个关键接口时,本地没有就需要各种调用了,虽然方法有点暴力,但没辙时还是很有效果的,稍作总结一、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/fmhalLOCAL_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.cppFMPcmHandler 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.mkLOCAL_SRC_FILES := FMHalSource.cpp RingBuffer.cpp tinyalsa_util.c定义:device/sprd/partner/trout/fmhal/tinyalsa_util.cint 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.cppextern "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.cextern bool ap_fw_loaded;kernel/driver/mmc/core/core.h             //这个头文件的声明貌似可以没有void mmc_power_off(struct mmc_host *host);//这个头文件的声明貌似可以没有全局函数的定义:kernel/driver/mmc/core/core.cvoid mmc_power_off(struct mmc_host *host){     //realize this function     // TO DO ...}其他地方调用: kernel\drivers\mmc\host\Sc8830.cextern void mmc_power_off(struct mmc_host* mmc);3.2这是在模块内部可以这样,直接全局就可以了;当kernel里要调用模块内部就无法extern过来了,或者模块之间好像也无法extern了;那么可以用EXPORT_SYMBOL变量的定义:kernel\arch\arm\mach-sc\Dhd_adapter.cstruct mmc_host *gMmc;EXPORT_SYMBOL_GPL(gMmc); 调用:kernel\drivers\net\wireless\bcmdhd\Bcmsdh_sdmmc_linux.cextern struct mmc_host *gMmc;函数的定义:kernel\drivers\mmc\host\Sc8830.cint 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.cextern int sdhci_device_attach(int on);
原创粉丝点击