我有一个功能列表:

JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_staticInit(JNIEnv* env, jclass clazz);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_gc(JNIEnv* env, jobject obj);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_adjustExternalMemory(JNIEnv* env, jobject obj, jint bytes);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_init(JNIEnv* env, jobject obj);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_runScript(JNIEnv* env, jobject obj, jstring code, jstring name);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_callFunction(JNIEnv* env, jobject obj, jstring name);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_callFunctionD(JNIEnv* env, jobject obj, jstring name, jdouble d);

我试图通过使用define摆脱一些重复:
#define JNIFUNC JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity
JNIFUNC_staticInit(JNIEnv* env, jclass clazz);
JNIFUNC_gc(JNIEnv* env, jobject obj);
JNIFUNC_adjustExternalMemory(JNIEnv* env, jobject obj, jint bytes);
JNIFUNC_init(JNIEnv* env, jobject obj);
JNIFUNC_runScript(JNIEnv* env, jobject obj, jstring code, jstring name);
JNIFUNC_callFunction(JNIEnv* env, jobject obj, jstring name);
JNIFUNC_callFunctionD(JNIEnv* env, jobject obj, jstring name, jdouble d);

但是,这可能不会产生所需的输出,大概是因为JNIFUNC_something未被识别为对JNIFUNC的引用。

我能完成我想要的吗?

最佳答案

您的预处理程序指令将查找 token JNIFUNC。 token JNIFUNC_staticInit是一个完全不同的 token ,即使它包含相同的子字符串。您可以为函数(例如JNIFUNC staticInit)放置空格而不是下划线,这将使预处理器替换 token ,但结果将是Java_weber_droidtilla_DTActivity staticInit(请注意空格),这很可能会导致语法错误。

C++解决方案是一个 namespace :

namespace Java_weber_droidtilla_DTActivity{
    void staticInit(...);
}

对于c,您可以执行以下操作(也适用于c++):
#define JNIFUNC(X) JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_##X
JNIFUNC(staticInit)(JNIEnv* env, jclass clazz);

10-06 10:23