2012-02-22 5 views
0

JNIAndroidに使用してインスタンスメソッドを呼び出す作業を進めています。すべてのコードはコンパイルされていますが、プロジェクトの内容を保護するために、私はコードの関連部分のみを表示します。次のコードブロック(C++ファイルで使用されるextern c)は、clsの静的メソッド[public String getMyString()]にアクセスしようとします。私はそれがclsのenvでないことを知っています。 中部はゼロに設定されておらず、nullも設定されていません。JNI NoSuchMethodException:パラメータ型がnullです

jmethodID mid = env->GetMethodID(cls, "getMyString", "()Ljava/lang/String;"); 
    if (mid == 0) { 
     __android_log_write(ANDROID_LOG_INFO, "JNI", "mid is 0"); 
    } 
    else { 
     __android_log_write(ANDROID_LOG_INFO, "JNI", "mid is not 0"); 
    } 
    jstr = (jstring) env->CallObjectMethod(obj, mid); 
    if (jstr == NULL) { 
     __android_log_write(ANDROID_LOG_INFO, "JNI", "jstr is NULL"); 
    } 
    else { 
     __android_log_write(ANDROID_LOG_INFO, "JNI", "jstr is not NULL"); 
    } 

    printf(" c.s = \"%s\"\n", env->GetStringUTFChars(jstr, NULL)); 

    return jstr; 

なおClass.javaを次のようにエラーが発生し

02-22 10:38:36.010: E/AndroidRuntime(17894): FATAL EXCEPTION: GLThread 10 
02-22 10:38:36.010: E/AndroidRuntime(17894): java.lang.NoSuchMethodException: parameter type is null 
02-22 10:38:36.010: E/AndroidRuntime(17894): at java.lang.ClassMembers.getConstructorOrMethod(ClassMembers.java:228) 
02-22 10:38:36.010: E/AndroidRuntime(17894): at java.lang.Class.getMethod(Class.java:904) 
02-22 10:38:36.010: E/AndroidRuntime(17894): at com.example.android.MyClass.getMyString(Native Method) 
02-22 10:38:36.010: ... 

コード:このネイティブメソッドは、Java側に戻ったときに、私は(Class.javaまでさかのぼる)次のエラーを取得しますそれは(反射用共通)Class<?>[]からヌルからのキャストでの問題であることを示唆しているようだ、私は私はそれが間違った方法を見つける半ばで行うことがよりまたはJSTRが戻ってきた感じていますncorrectly(logcatはjstrがヌルではないと述べています)。

最後に、Javaの側関連するコードは次の通りである:

ネイティブ呼び出し:

public static native String getMyNativeString(); 

ネイティブメソッドの呼び出し:

String myStr = callGetMyNativeString(); 

される方法アクセス:

public String getMyString() { 
    return "Foobar"; 
} 

答えて

0

完全なJavaコードを見ずにこれを確認することはできません。しかし、ネイティブメソッドは静的として定義されており、JavaメソッドgetMyString()は静的ではありません。だから、JNIからobjgetMyString()を呼び出す必要がありますか?

関連する問題