函数及变量跨模块调用

有时候要获取一个关键接口时,本地没有就需要各种调用了,虽然方法有点暴力,但没辙时还是很有效果的,稍作总结

一、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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值