jni本机函数重载签名

sup*_*oon 2 c++ java java-native-interface android

我在声明JNI本机函数时尝试使用函数重载.

Java方法是:

public native static void methodaaa(String type, int errorCode);
public native static void methodaaa(String type, byte[] byts);
Run Code Online (Sandbox Code Playgroud)

没有重载,代码如下所示:

JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa(JNIEnv* env, jobject thiz, jstring type, jint errorCode){}
Run Code Online (Sandbox Code Playgroud)

这很好用.

然后我尝试添加重载:

JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa(JNIEnv* env, jobject thiz, jstring type, jint errorCode){}

JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa(JNIEnv* env, jobject thiz, jstring type, jbyteArray buffer){}
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

conflicting types for Java_com_xxx_yyy_JavaCallCpp_methodaaa
Run Code Online (Sandbox Code Playgroud)

然后我做了一些研究,似乎我需要在我想要重载的函数的末尾添加一个"__",并附加参数Name mangling.

所以我尝试过:

JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa__Ljava_lang_String_I(JNIEnv* env, jobject thiz, jstring type, jint errorCode){}

JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa__Ljava_lang_String_B(JNIEnv* env, jobject thiz, jstring type, jbyteArray buffer){}
Run Code Online (Sandbox Code Playgroud)

但它仍然无效,错误是:

No implementation found for native Lcom/xxx/yyy/JavaCallCpp;.methodaaa:(Ljava/lang/String;I)V
Run Code Online (Sandbox Code Playgroud)

有人知道如何用jstring作为参数编写JNICALL函数名,或者我在这里做错了什么?

任何建议将不胜感激,谢谢:)

更新:

我在这里找到了链接:

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html

然后尝试修改我的代码:

JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa__Ljava_lang_String_2I(JNIEnv* env, jobject thiz, jstring type, jint errorCode){}

JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa__Ljava_lang_String_2B(JNIEnv* env, jobject thiz, jstring type, jbyteArray buffer){}
Run Code Online (Sandbox Code Playgroud)

但是,我仍然得到同样的错误:

No implementation found for native Lcom/xxx/yyy/JavaCallCpp;.methodaaa:(Ljava/lang/String;I)V
Run Code Online (Sandbox Code Playgroud)

use*_*421 6

不要试图自己弄清楚JNI方法签名.使用输出javah.这绝不是错的.