2016-11-26 11 views
0

JNIネイティブ関数を宣言するときに関数オーバーロードを使用しようとしています。jniネイティブ関数オーバーロードシグニチャ

Javaメソッドは次のとおりです。

公共ネイティブの静的な無効methodaaa(文字列型、int型のerrorCode)。 public static final void methodaaa(String型、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を追加します。

は、だから私が試した:

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 
関連する問題