2013-08-30 41 views
0

我正在寫一個宏生成JNI方法名稱,使用預處理,使生活更輕鬆:錯誤:粘貼「Java_com_my_packagename_myClass_myMethod」和「(」不給出一個有效的預處理標記

#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) 

但是,編譯救援人員到場WS當我試圖用我的宏以下錯誤:

錯誤:粘貼「Java_com_my_packagename_myClass_myMethod」和「(」不給出一個有效的預處理標記

有誰知道爲什麼宏失敗?

+0

請了解'##'預處理器連接運算符。或者,如果您想要遠程理解任何內容,請完全避免預處理器。 – syam

+0

我很驚訝它抱怨*''Java_com_my_packagename_myClass_myMethod「'和'」(「',因爲你的宏定義中沒有標記粘貼操作符。你確定這是產生該消息的確切代碼? –

+0

爲什麼?爲什麼不按照設計者的意圖使用'javap'? – EJP

回答

2

您需要連接字符串一樣:

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)) 
相關問題