JNI
をAndroid
に使用してインスタンスメソッドを呼び出す作業を進めています。すべてのコードはコンパイルされていますが、プロジェクトの内容を保護するために、私はコードの関連部分のみを表示します。次のコードブロック(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";
}