我知道之前有很多这样的问题,但我就是想不通为什么我的代码不起作用。所以我有一个存储字符串的简单类:
public class JniString {
private String mString;
public JniString() {}
public String getString() {
return mString;
}
public void setString(String s) {
mString = s;
}
}
我的 JNI 代码(在 C 中)应该将 JniString 对象作为参数,调用 setString() 函数来存储一些数据,并返回一个整数:
JNIEXPORT jint
JNICALL Java_com_sample_MyClass_test(JNIEnv *env, jobject thiz, jobject jniString) {
jclass clazz = (*env)->FindClass(env, "com/sample/JniString");
jmethodID methodId = (*env)->GetMethodID(env, clazz, "setString", "(Ljava/lang/String;)V");
jstring placeholder = (*env)->NewStringUTF(env, "placeholder");
(*env)->CallVoidMethod(env, clazz, methodId, placeholder);
return 1;
}
还有我的 Java 代码:
JniString jniString = new JniString();
// Call test() JNI function with jniString as argument
但由于某种原因,这一直失败并显示以下错误消息:
05-24 23:27:23.099 7575-7575/? A/art﹕ art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: can't call void com.sample.JniString.setString(java.lang.String) on instance of java.lang.Class<com.sample.JniString>
05-24 23:27:23.099 7575-7575/? A/art﹕ art/runtime/java_vm_ext.cc:410] in call to CallVoidMethod
我在此处阅读了一些关于必须调用 NewGlobalRef() 或自从 ICS(我在 KitKat+ 上运行我的应用程序)以来的内容:http://android-developers.blogspot.ie/2011/11/jni-local-reference-changes-in-ics.html
但我无法理解博文的内容,也无法理解将其放在代码中的什么位置。任何帮助将不胜感激。谢谢!
编辑: 我将 JNI 代码修改为以下内容:
JNIEXPORT jint
JNICALL Java_com_sample_MyClass_test(JNIEnv *env, jobject thiz, jobject jniString) {
jclass clazz = (*env)->GetObjectClass(env, jniString);
jmethodID methodId = (*env)->GetMethodID(env, clazz, "setString", "(Ljava/lang/String;)V");
jstring placeholder = (*env)->NewStringUTF(env, "placeholder");
(*env)->CallVoidMethod(env, jniString, methodId, placeholder);
return 1;
}
但现在我得到了一个不同的错误:
05-25 19:11:02.832 8802-8802/com.sample E/art﹕ JNI ERROR (app bug): attempt to use stale local reference 0x1 (should be 0x100001)
05-25 19:11:02.850 8802-8802/com.sample A/art﹕ art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0x1
最佳答案
您正在尝试通过类而不是通过实例调用实例方法。第二个参数需要是 JniString
的对象实例,在本例中可能是 jniString
。
关于java - 从 JNI 调用 Java 对象中的方法返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35166950/