2016-09-06 2 views
0

Ich versuche, Von java.io.Reader zu einem Zeichenpuffer zu lesen, der in C mit posix_memalign zugewiesen wurde.JNI GetMethodID Ausnahme im Thread "main" java.lang.NoSuchMethodError: <method>

In meinem Java-Code

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));} 

} 

Für den C++ Code, habe ich die folgenden.

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); 

} 

Das Problem ist, dass ich

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

Der Zweck dieser Methode des Erhaltens, die ich von einem Leser auf einen Puffer lesen möchten, die in C zugeordnet ist ++ (I Rechnung UTF16 nehme (16 Bit) pro Char Problem beim Zuweisen des Puffers).

Aufgrund dieses Fehlers habe ich nicht überprüft, ob das Lesen der Pufferimplementierung funktioniert. Aber einige Einsichten werden nicht schaden.

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

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

Wie haben Sie den cpp-Header generiert? – neohope

+0

mit javah-jni –

+0

habe es nicht verpackt, es befindet sich in LowerCaseTokenizer.java Datei, die ich ausführen und kompilieren und sofort für schnellere Tests laufen. –

Antwort

0

Die Signatur der Lesefunktion lautet nicht "(C [II) I].

Ich schrieb in c nicht cpp. Aber ich denke, Sie müssen nur die Signatur der Lesemethode ersetzen.

/* 
* 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

Es hat funktioniert !!! Vielen Dank. –

2

java.lang.NoSuchMethodError bedeutet, dass Java nicht in der Lage ist, ein Verfahren mit einem Namen und Unterschrift passenden was anzubieten zu finden. Ihre Anfrage ist:

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

Sie die Signatur richtigen Typ bekommen mit javap

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

Aber Sie verwenden (C[II)I statt ([CII)I --- Ihr [ fehl am Platze ist.

+0

Danke das ist sehr wertvolle Info. –

+0

Ich mag es, dass Sie Javap erwähnt haben – user2543253

Verwandte Themen