我正在使用JNI
中的Android
调用实例方法。所有代码编译,但为了保护项目的内容,我只会显示代码的相关部分。以下代码块( 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声明 jstr 非空)。
最后,Java端相关代码如下:
本地电话:
public static native String getMyNativeString();
对本机方法的调用:
String myStr = callGetMyNativeString();
正在访问的方法:
public String getMyString() {
return "Foobar";
}
答案 0 :(得分:0)
如果没有看到完整的java代码,我无法确定这一点。但是本机方法被定义为静态,而java方法getMyString()
是非静态的。那么从JNI开始,你是如何得到obj
来调用getMyString()
的?{/ p>