【发布时间】:2015-10-08 10:23:01
【问题描述】:
我正在开发一个基于 JNI 的大型项目。 JNI 需要某些 C 函数名来匹配相关的 JAVA 函数名。我在说什么的例子:
Example.java
package com.example.app;
...
class Example {
public static native void doSomething();
}
Example.c
JNIEXPORT void JNICALL Java_com_example_app_Example_doSomething(...) {...}
我正在使用宏来简化符号:
#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_com_example_app_Example_##name(..., __VA_ARGS)
但是当我尝试用另一个宏返回值替换宏中的..com_example_app... 部分时遇到了问题:
#define J_PACKAGE(separator) "com" separator "example" separator "app"
#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_##J_PACKAGE("_")##_##name(..., __VA_ARGS)
有没有正确模拟我写的语法?它似乎不起作用。
附:我也在代码的其他部分使用 J_PACKAGE 宏,只是使用了不同的分隔符。
示例 1
#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_com_example_app_Example_##name(JNIEnv* env, jobject obj, __VA_ARGS__)
J_DEF(myFunction); // generates: JNIEXPORT void JNICALL Java_com_example_app_Example_myFunction(JNIEnv* env, jobject obj);
J_DEF(myFunction, int x); // generates: JNIEXPORT void JNICALL Java_com_example_app_Example_myFunction(JNIEnv* env, jobject obj, int x);
示例 2
#define J_PACKAGE(separator) "com" separator "example" separator "app"
#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_##J_PACKAGE(_)##_##name(JNIEnv* env, jobject obj, __VA_ARGS__)
J_DEF(myFunction); // generates: void Java_J_PACKAGE(_)_myFunc(JNIEnv* env, jobject obj );
// instead I need to generate JNIEXPORT void JNICALL Java_com_example_app_Example_myFunction(JNIEnv* env, jobject obj);
【问题讨论】:
-
“它似乎不起作用”是什么意思?你能给出一个示例输入,你期望的输出和你实际得到的输出吗?
-
您似乎使用字符串常量作为方法名称。在 J_PACKAGE 中使用 ## 并删除 "
-
我已经用具体例子更新了这个问题。
标签: c++ macros c-preprocessor