jni本机函数重载签名

时间:2016-11-26 03:13:42

标签: java android c++ java-native-interface

我在声明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

4 个答案:

答案 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 添加在函数中,对我有用。