I know there are many questions like this asked before, but I just cannot figure out why my code is not working. So I have a simple class that stores a String:
public class JniString {
private String mString;
public JniString() {}
public String getString() {
return mString;
}
public void setString(String s) {
mString = s;
}
}
My JNI code (in C), which is supposed to take JniString object as argument, call setString() function to store some data, and return an integer:
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;
}
And my Java code:
JniString jniString = new JniString();
// Call test() JNI function with jniString as argument
But for some reason, this keeps failing with the following error message:
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
I read something about having to call NewGlobalRef() or something since ICS (I'm running my app on KitKat+) over here: http://android-developers.blogspot.ie/2011/11/jni-local-reference-changes-in-ics.html
But I can't understand what the blog post is saying, or where I would put that in the code. Any help would be greatly appreciated. Thanks!
EDIT: I modified the JNI code to be the following:
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;
}
But now I'm getting a different error:
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