我在声明JNI本机函数时尝试使用函数重载。
Java方法是:
public native static void methodaaa(String type, int errorCode);
public native static void methodaaa(String type, byte[] byts);
没有重载,代码如下所示:
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, jint errorCode){}
JNIEXPORT void JNICALL Java_com_xxx_yyy_JavaCallCpp_methodaaa(JNIEnv* env, jobject thiz, jstring type, jbyteArray buffer){}
这给了我错误:
conflicting types for Java_com_xxx_yyy_JavaCallCpp_methodaaa
然后我做了一些研究,似乎我需要添加一个" __"到我想要重载的函数的末尾,并附加参数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){}
但它仍然不起作用,错误是:
No implementation found for native Lcom/xxx/yyy/JavaCallCpp;.methodaaa:(Ljava/lang/String;I)V
有人知道如何使用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){}
但是,我仍然得到同样的错误:
No implementation found for native Lcom/xxx/yyy/JavaCallCpp;.methodaaa:(Ljava/lang/String;I)V
答案 0 :(得分:6)
不要试图自己弄清楚JNI方法签名。使用javah
的输出。这绝不是错的。
答案 1 :(得分:3)
https://edux.pjwstk.edu.pl/mat/268/lec/lect10/lecture10.html
也许这会对你有所帮助
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class getter_number_GetNumber */
#ifndef _Included_getter_number_GetNumber
#define _Included_getter_number_GetNumber
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: getter_number_GetNumber
* Method: getNumber
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_getter_number_GetNumber_getNumber__
(JNIEnv *, jobject);
/*
* Class: getter_number_GetNumber
* Method: getNumber
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL Java_getter_number_GetNumber_getNumber__J
(JNIEnv *, jobject, jlong);
/*
* Class: getter_number_GetNumber
* Method: getNumber
* Signature: (FF)F
*/
JNIEXPORT jfloat JNICALL Java_getter_number_GetNumber_getNumber__FF
(JNIEnv *, jobject, jfloat, jfloat);
#ifdef __cplusplus
}
#endif
#endif
表格中显示了基元类型的字段描述符。
Java type Field descriptor
boolean Z
byte B
char C
short S
int I
long J
float F
double D
答案 2 :(得分:2)
此外,JNI函数名称是C,而不是C ++。它们不能超载。
答案 3 :(得分:0)
__J 添加在函数中,对我有用。