我正在开发一个相当大的基于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)
有没有正确模拟语法,我写过?它似乎不起作用。
P.S。我也将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);
答案 0 :(得分:0)
我认为这可以解决您的问题:
#define J_PACKAGE(sep) com ## sep ## example ## sep ## app
#define JDEF2(A, B) JNIEXPORT void JNICALL java_##A##_##B
#define JDEF1(A, B) JDEF2( A, B)
#define J_DEF(C, ...) JDEF1( J_PACKAGE(_), C) (JNIEnv* env, jobject obj, __VA_ARGS__)