vgo*_*anz 5 c++ linker exception c-preprocessor
我在Ubuntu上使用Eclipse + Qualcomm库(在cpp中)+ Android SDK.我的应用运行良好.如果我更改了Qualcomm库中的一些代码,它会编译并正常工作.
问题是:我已经更改了项目的名称,我必须更改cpp中的一些代码(函数的名称),如果我不这样做,我会得到一个Java.lang.UNSATISFIEDLINKERROR.
那是因为所有函数的名称都是Android包,如下所示:
Java_org_myproject_marker_MainActivity_onQCARInitializedNative(JNIEnv *, jobject)
Run Code Online (Sandbox Code Playgroud)
然后我定义一个像这样的宏:
#define MAIN_ACTIVITY_PREFIX org_myproject_marker_MainActivity
#define VISUALIZER_PREFIX org_myproject_marker_Visualizer
Run Code Online (Sandbox Code Playgroud)
我通过以下方式更改所有正确的功能:
Java_MAIN_ACTIVITY_PREFIX_onQCARInitializedNative(JNIEnv *, jobject)
Run Code Online (Sandbox Code Playgroud)
但我仍然得到Java.lang.UNSATISFIEDLINKERROR例外.
如果我没有#define宏(并写下所有行),它可以工作,但我想用顶级定义保存cpp代码,如果我需要在其他项目中使用它,它会自动更改所有内容.
我已阅读本教程.我不能替换另一个文本中的文本或类似的东西吗?
你正在寻找字符串连接,像这样:
#define MAIN_ACTIVITY_PREFIX(n) Java_org_myproject_marker_MainActivity##n
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject)
Run Code Online (Sandbox Code Playgroud)
实际上,CPP宏不会在标识符的中间扩展.试试吧
#define MAIN_ACTIVITY_PREFIX(func) Java_org_myproject_marker_MainActivity##func
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个宏,该宏将添加Java_org_myproject_marker_MainActivity到您传递的函数名称之前.用它作为:
MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject) {
...
}
Run Code Online (Sandbox Code Playgroud)