正确使用cpp中的define宏替换函数名称

时间:2012-01-09 08:39:21

标签: c++ exception linker c-preprocessor

我在Ubuntu上使用Eclipse + Qualcomm库(在cpp中)+ Android SDK。我的应用运行良好。如果我更改了Qualcomm库中的一些代码,它会编译并正常工作。

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

那是因为所有函数的名称都是Android包,如下所示:

Java_org_myproject_marker_MainActivity_onQCARInitializedNative(JNIEnv *, jobject)

然后我定义一个像这样的宏:

#define MAIN_ACTIVITY_PREFIX org_myproject_marker_MainActivity
#define VISUALIZER_PREFIX org_myproject_marker_Visualizer

我通过以下方式更改了所有正确的功能:

Java_MAIN_ACTIVITY_PREFIX_onQCARInitializedNative(JNIEnv *, jobject)

但我仍然得到Java.lang.UNSATISFIEDLINKERROR例外。

如果我没有#define宏(并写下所有行),它可以工作,但是我想用顶级定义保存cpp代码,如果我需要在其他项目中使用它,它会自动更改所有内容

我看过this tutorial。我不能替换另一个文本或类似内容中的文本吗?

2 个答案:

答案 0 :(得分:7)

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

#define MAIN_ACTIVITY_PREFIX(n) Java_org_myproject_marker_MainActivity##n

然后像这样使用它:

MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject)

答案 1 :(得分:7)

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

 #define MAIN_ACTIVITY_PREFIX(func) Java_org_myproject_marker_MainActivity##func

它为您提供了一个宏,它将Java_org_myproject_marker_MainActivity添加到您传递它的函数名称之前。用它作为:

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