我目前正在与JNI(Java原住民接口)合作,在 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);
In order to avoid having this question too long I didn t paste the declaration of SET_DECLARATION_PARAMS and SET_DECLARED_PARAMS but the first one will result in something like jint arg1 and the second in arg1 without the type.
问题在于:有没有办法为 j或Ljava_lang_String_2 for jstring创造宏观回报。 请注意,无法使用扼杀装置,需要将ILjava_lang_String_2而不是II列入第二个生成的方法名称。
感谢!