java - 从 JNI 调用 Java 对象中的方法返回错误

标签 java android android-ndk java-native-interface

我知道之前有很多这样的问题,但我就是想不通为什么我的代码不起作用。所以我有一个存储字符串的简单类:

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/

相关文章:

java - vlcj libvlc 流媒体桌面在一段时间后停止

android - 以 mm/yy 格式格式化到期日期

android - 使用 GSON 进行 JSON 反序列化

android - 如何为您的 android 设置找到 ndk 修订号

安卓工作室 NDK : could not load library "libgnuSTL_shared.so"

java - 如何处理错误 readJavaFormatString(FloatingDecimal.java :991)

java - 连接四个 WinCheck

java - ORMlite 更改主键

Android- Webview onPageFinished 调用了两次

android - FFMPEG + Android 包装器使用 FFMPEG 的最新版本