Я работаю над вызовом метода экземпляра, используя JNI
в Android
.Весь код компилируется, но для защиты содержимого проекта я покажу только соответствующие части кода.Следующий блок кода (extern c
используется в файле c ++ ) пытается получить доступ к статическому методу [public String getMyString()
] в cls .Я знаю, что cls и env не равны нулю. mid не равно нулю и не null .Когда этот собственный метод возвращается на сторону Java, я получаю следующую ошибку (восходит к 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: ...
Код, который генерирует ошибку, выглядит следующим образом:
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, кажется, предполагает, что это проблема с приведением от null до Class<?>[]
(обычное для отражения), у меня есть ощущение, что оно имеет большее отношение к mid обнаружение неправильного метода или jstr , возвращающегося некорректно (logcat утверждает, что jstr НЕ является нулевым).
Наконец, сторона Javaсоответствующий код выглядит следующим образом:
Собственный вызов:
public static native String getMyNativeString();
Вызов собственного метода:
String myStr = callGetMyNativeString();
Метод, к которому осуществляется доступ:
public String getMyString() {
return "Foobar";
}