错误:粘贴"Java_com_my_packagename_myClass_myMethod"和"("未提供有效的预处理令牌

error: pasting "Java_com_my_packagename_myClass_myMethod" and "(" does not give a valid preprocessing token

本文关键字:预处理 令牌 有效 myClass Java 粘贴 com my 错误 packagename myMethod      更新时间:2023-10-16

我正在编写一个宏,通过使用预处理器生成JNI方法名来简化生活

#define JNI_WRAPPER_METHOD (className, methodName, returnValue, PARAMS) 
JNIEXPORT returnValue JNICALL Java_com_my_packagename_className_methodName
(JNIEnv *env, jobject obj, BOOST_PP_SEQ_ENUM(PARAMS))

所以,理想情况下是这样的:

JNI_WRAPPER_METHOD(myClass, myMethod, jint, (jint myInt)(jstring myString))

可以翻译为:

JNIEXPORT jint JNICALL Java_com_my_packagename_myClass_myMethod(JNIEnv *env, jobject obj, jint myInt, jstring myString)

但是,当我尝试使用宏时,编译器会抛出以下错误:

错误:粘贴"Java_com_my_packagename_myClass_myMethod"answers"("不会提供有效的预处理令牌

有人知道宏失败的原因吗?

您需要连接字符串,如:

 Java_com_my_packagename_ ## className ## _ ## methodName

也不要在定义中留下空格:

#define JNI_WRAPPER_METHOD(className, methodName, returnValue, PARAMS) 

总而言之,以下操作很好:

#define JNI_WRAPPER_METHOD(className, methodName, returnValue, PARAMS) 
        JNIEXPORT returnValue JNICALL                                  
        Java_com_my_packagename_ ## className ## _ ## methodName       
        (JNIEnv *env, jobject obj, BOOST_PP_SEQ_ENUM(PARAMS))