我正在使用Android
中的JNI
调用实例方法。所有的代码都编译好了,但为了保护项目的内容,我只会展示代码的相关部分。以下代码块(在c++文件中使用的extern c
)尝试访问cls中的静态方法[public String getMyString()
]。我知道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声明jsontrNOT null)。
最后,Java端的相关代码如下:
本机调用:
public static native String getMyNativeString();
对本机方法的调用:
String myStr = callGetMyNativeString();
正在访问的方法:
public String getMyString() {
return "Foobar";
}
如果没有看到完整的java代码,我就无法确定这一点。但是本机方法被定义为静态的,而java方法getMyString()
是非静态的。那么,从JNI,你是如何获得调用getMyString()
所需的obj
的?