Я пишу макрос, чтобы сделать жизнь проще, генерируя имена методов 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» и «(» не дает действительный токен предварительной обработки
Кто-нибудь знает, почему не работает макрос?
Вам нужно объединить строки, такие как:
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))
Других решений пока нет …