2016-11-26 90 views
0

我試圖在聲明JNI原生函數時使用函數重載。jni原生函數重載簽名

Java方法是:

公共本機靜態無效methodaaa(字符串類型,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

'Ljava_lang_String_2B'將是'Ljava/lang/String; B'。既然你已經有'Ljava/lang/String; [B'你想'Ljava_lang_String_2_3B'。 – Michael

+0

請顯示您的Java函數聲明。然後我們會做@EJP [說](http://stackoverflow.com/a/40814674/2226988)。 –

回答

3

不要試圖自己找出JNI方法簽名。使用javah的輸出。這絕不是錯的。

1

此外,JNI函數名稱是C,而不是C++。它們不能超載。

+0

他們是C;但JNI規範允許通過將參數信息添加到JNI函數名稱的尾部(類似於C++名稱修飾,但不相同)來允許「超載」。 –

1

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