C++ 在cpp中正确使用定义宏替换函数名

C++ 在cpp中正确使用定义宏替换函数名,c++,exception,linker,c-preprocessor,C++,Exception,Linker,C Preprocessor,我在Ubuntu上使用Eclipse+高通库(cpp)+Android SDK。我的应用程序运行良好。如果我更改qualcomm库中的某些代码,它将正确编译并工作 问题是:我已经更改了项目的名称,我必须更改cpp(函数名称)中的一些代码,如果我不这样做,我会得到一个Java.lang.unsatifiedLinkError 这是因为所有函数的名称都与Android软件包相同,如下所示: Java_org_myproject_marker_MainActivity_onQCARInitialize

我在Ubuntu上使用Eclipse+高通库(cpp)+Android SDK。我的应用程序运行良好。如果我更改qualcomm库中的某些代码,它将正确编译并工作

问题是:我已经更改了项目的名称,我必须更改cpp(函数名称)中的一些代码,如果我不这样做,我会得到一个
Java.lang.unsatifiedLinkError

这是因为所有函数的名称都与Android软件包相同,如下所示:

Java_org_myproject_marker_MainActivity_onQCARInitializedNative(JNIEnv *, jobject)
#define MAIN_ACTIVITY_PREFIX org_myproject_marker_MainActivity
#define VISUALIZER_PREFIX org_myproject_marker_Visualizer
#define MAIN_ACTIVITY_PREFIX(n) Java_org_myproject_marker_MainActivity##n
MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject)
然后我定义一个宏,如下所示:

Java_org_myproject_marker_MainActivity_onQCARInitializedNative(JNIEnv *, jobject)
#define MAIN_ACTIVITY_PREFIX org_myproject_marker_MainActivity
#define VISUALIZER_PREFIX org_myproject_marker_Visualizer
#define MAIN_ACTIVITY_PREFIX(n) Java_org_myproject_marker_MainActivity##n
MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject)
我通过以下方式更改所有正确的功能:

Java_MAIN_ACTIVITY_PREFIX_onQCARInitializedNative(JNIEnv *, jobject)
但是我仍然得到
Java.lang.UNSATISFIEDLINKERROR
异常

如果我不使用
#define
宏(并写入所有行),它就可以工作,但我想用top define保存cpp代码,如果我需要在其他项目中使用它,它会自动更改所有内容


我读过。我不能在另一个文本或类似文本中替换文本吗?

您正在寻找字符串连接,如下所示:

Java_org_myproject_marker_MainActivity_onQCARInitializedNative(JNIEnv *, jobject)
#define MAIN_ACTIVITY_PREFIX org_myproject_marker_MainActivity
#define VISUALIZER_PREFIX org_myproject_marker_Visualizer
#define MAIN_ACTIVITY_PREFIX(n) Java_org_myproject_marker_MainActivity##n
MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject)
然后像这样使用它:

Java_org_myproject_marker_MainActivity_onQCARInitializedNative(JNIEnv *, jobject)
#define MAIN_ACTIVITY_PREFIX org_myproject_marker_MainActivity
#define VISUALIZER_PREFIX org_myproject_marker_Visualizer
#define MAIN_ACTIVITY_PREFIX(n) Java_org_myproject_marker_MainActivity##n
MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject)

实际上,CPP宏不会在标识符的中间扩展。试一试

 #define MAIN_ACTIVITY_PREFIX(func) Java_org_myproject_marker_MainActivity##func
这将为您提供一个宏,将
Java\u org\u myproject\u marker\u main activity
前置到您传递给它的函数名。将其用作:

MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject) {
    ...
}