2016-09-06 4 views
0

java.io.Readerから、posix_memalignを使用してCで割り当てられたcharバッファに読み込もうとしています。 C++コードの場合スレッド "main"のJNI GetMethodID例外java.lang.NoSuchMethodError:<method>

私のJavaコードで

public class LowerCaseTokenizer 
{ 

public native void Initialize(Reader input) throws IOException; 
public static String example = "XY&Z Corporation - [email protected]"; 

    public LowerCaseTokenizer(Reader input) throws IOException { 

    Initialize(input); 
    } 

    public static void main(String[] args) throws IOException { 

     System.loadLibrary("LowerCaseTokenizer"); 

     LowerCaseTokenizer sample = new LowerCaseTokenizer(new StringReader(example));} 

} 

、私は次のことをやりました。

JNIEXPORT void JNICALL Java_LowerCaseTokenizer_Initialize(JNIEnv *env, jobject obj1, jobject obj2){ 

jclass input_class = env->GetObjectClass(obj2); 
    jmethodID jread_method = env->GetMethodID(input_class, "read", "(C[II)I"); 

    print_object_class_name(env, obj2); 

} 

問題は、私はこの方法を取得の目的は、私はC++に割り当てられたバッファに読者から読みたい(私は(アカウントのUTF16に取っていますされ

Calling class is: java.io.StringReader // print_object_class_name(env, obj2); 
Exception in thread "main" java.lang.NoSuchMethodError: read 

を得るということです16ビット)のバッファを割り当てています。

このバグのために、私はバッファの実装への読み込みがうまくいくかチェックしていません。しかし、いくつかの洞察は傷つくことはありません。

do{ 
    numCharsRead = env->CallIntMethod(obj2, jread_method ,source_ptr ,off , len); 

    }while(numCharsRead != -1); 
+0

どのようにcppヘッダーを生成しましたか? – neohope

+0

javah -jni –

+0

を使用してパッケージ化していない場合は、LowerCaseTokenizer.javaファイルにあります。これを実行してコンパイルして、すぐにテストを実行します。 –

答えて

0

読み取り関数のシグネチャは "(C [II)I"ではありません。

私はc not cppに書き込みました。しかし、私はreadメソッドのシグネチャを置き換えるだけでいいと思います。

/* 
* Class:  com_neohope_jni_test_LowerCaseTokenizer 
* Method: Initialize 
* Signature: (Ljava/io/Reader;)V 
*/ 
JNIEXPORT void JNICALL Java_com_neohope_jni_test_LowerCaseTokenizer_Initialize 
(JNIEnv *env, jobject caller, jobject reader) 
{ 
    getJniClassName(env, caller); 
    getJniClassName(env, reader); 

    jclass clazz = (*env)->GetObjectClass(env, reader); 
    if (clazz == NULL)return; 

    jmethodID midRead01 = (*env)->GetMethodID(env, clazz, "read", "()I"); 
    jmethodID midRead02 = (*env)->GetMethodID(env, clazz, "read", "([C)I"); 
    jmethodID midRead03 = (*env)->GetMethodID(env, clazz, "read", "([CII)I"); 

    //do your job here 
    if (midRead01 == NULL)return; 
    jint ret = (*env)->CallIntMethod(env, reader, midRead01); 
    printf("%l", ret); 
} 
+0

それは働いた!ありがとうございました。 –

2

java.lang.NoSuchMethodError Javaはあなたが要求したものに一致する名前とシグネチャを持つメソッドを見つけることができないことを意味しています。あなたのリクエストは次のとおりです。

env->GetMethodID(input_class, "read", "(C[II)I"); 

あなたは

> javap -s -classpath rt.jar java/io/StringReader 
    ... 
    public int read(char[], int, int) throws java.io.IOException; 
    Signature: ([CII)I 

しかし、あなたの代わりに([CII)I(C[II)Iを使用しているを使用してjavap正しい型シグネチャを取得することができます---あなたの[は見当違いです。

+0

ありがとう、それは非常に貴重な情報です。 –

+0

私はあなたがjavap – user2543253

関連する問題