В настоящее время я работаю с JNI (Java Native Interface) для отправки данных между Java и C ++. После реализации небольшого количества кода я понял, что код для каждого метода всегда был похожим. Примером может быть:
JNIEXPORT void JNICALL Java_com_trial_jni_Receiver_setData__II(JNIEnv * env, jobject thiz, jint nativeObject, jint value)
{
reinterpret_cast<Receiver *>(nativeObject)->setData(value);
}
JNIEXPORT void JNICALL Java_com_trial_jni_Receiver_setData__ILjava_lang_String_2(JNIEnv *env, jobject thiz, jint nativeObject, jstring value)
{
reinterpret_cast<Receiver *>(nativeObject)->setData(value);
}
Поскольку весь код имеет схожую структуру, я решил сгенерировать набор макросов для автоматической генерации всего этого кода. Благодаря ответу Грегори Пакоша в этой ссылке Возможно ли перебирать аргументы в вариационных макросах? Теперь я могу с помощью препроцессора проверить, сколько параметров я ввел в макрос, и обработать каждый отдельный параметр.
Но из предыдущего примера есть то, чего я не могу достичь, чего бы я хотел. Предположим, у меня есть этот метод внутри макроса с именем JNI_METHOD. Я хотел бы сделать что-то вроде этого:
#define JNI_METHOD(package,clazz,method,...) \
JNIEXPORT void JNICALL Java_ ##package## _ ##clazz## _ ##method##__II(JNIEnv * env, jobject thiz, jint nativeObject, SET_DECLARATION_PARAMS(__VA_ARGS__ )) \
{ \
reinterpret_cast<clazz *>(nativeObject)->method(SET_DECLARED_PARAMS(__VA_ARGS__)); \
}
JNI_METHOD(com_trial_jni,Receiver,setData,jint);
JNI_METHOD(com_trial_jni,Receiver,setData,jstring);
Чтобы не задавать этот вопрос слишком долго, я не вставлял объявление SET_DECLARATION_PARAMS и SET_DECLARED_PARAMS, но первое приведёт к чему-то вроде 'jint arg1', а второе в 'arg1' без типа.
Вопрос в том, есть ли способ сгенерировать макрос, возвращающий «I» для «jint» или «Ljava_lang_String_2» для «jstring». Обратите внимание, что строковая спецификация не может использоваться, и это необходимо, чтобы во втором сгенерированном имени метода было указано «ILjava_lang_String_2» вместо «II».
Спасибо!