【问题标题】:Replacing a name of a function using define macros in cpp correctly正确使用 cpp 中的定义宏替换函数名称
【发布时间】:2012-01-09 08:39:21
【问题描述】:

我在 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。我不能替换另一个文本中的文本或类似的东西吗?

【问题讨论】:

    标签: c++ exception linker c-preprocessor


    【解决方案1】:

    你正在寻找字符串连接,像这样:

    #define MAIN_ACTIVITY_PREFIX(n) Java_org_myproject_marker_MainActivity##n
    

    然后像这样使用它:

    MAIN_ACTIVITY_PREFIX(_onQCARInitializedNative)(JNIEnv *, jobject)
    

    【讨论】:

      【解决方案2】:

      确实,CPP 宏不会在标识符中间展开。试试

       #define MAIN_ACTIVITY_PREFIX(func) Java_org_myproject_marker_MainActivity##func
      

      这会给你一个宏,它将Java_org_myproject_marker_MainActivity 添加到你传递给它的函数名之前。将其用作:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-06
        • 1970-01-01
        • 2021-04-02
        • 2020-10-07
        相关资源
        最近更新 更多