【问题标题】:JNI DETECTED ERROR IN APPLICATION: use of invalid jobject应用程序中的 JNI 检测到错误:使用了无效的作业
【发布时间】:2017-08-15 22:06:34
【问题描述】:
public class MyOpaqueBasedJSONDict implements IMyJSONDict {

    private final long _myNativeCPPObj;
...

public IMyJSONDict getMyJSONObj(String keyName) {
        long retVal = nativeGetJSOBObject(_myNativeCPPObj,keyName);
        return (new MyOpaqueBasedJSONDict(retVal));
    }

native implementation
NIEXPORT jlong JNICALL
Java_com_hexample_myndkapplication_MyOpaqueBasedJSONDict_nativeGetJSOBObject(JNIEnv *env,
                                                                             jobject instance,
                                                                             jlong myNativeCPPObj,
                                                                             jstring keyName_) {
    const char *keyName = env->GetStringUTFChars(keyName_, 0);

    Json::Value* nativeCppJson_ptr = reinterpret_cast<Json::Value*> (myNativeCPPObj);

    Json::Value& map = *nativeCppJson_ptr;

    Json::Value& jsonVal = map[keyName];
    env->ReleaseStringUTFChars(keyName_, keyName);
    return (jlong) &jsonVal;
}

我不明白我为什么会得到

在应用程序中检测到 JNI 错误:使用了无效的 jobject 0xb4019a80 08-16 03:25:56.785 20537-20537/com.hexample.myndkapplication A/艺术: art/runtime/java_vm_ext.cc:410] 从长 com.hexample.myndkapplication.MyOpaqueBasedJSONDict.nativeGetJSOBObject

任何线索如何调试 ndk 中的无效内存错误。我对 Android 和 ndk 开发还很陌生。

【问题讨论】:

    标签: android-ndk


    【解决方案1】:

    就我而言,我在多本机线程中使用了 jobject:

    javaCallBackObj = env->NewGlobalRef(jobj);
    

    但是请注意,jclass 是一个类引用,必须通过调用 NewGlobalRef 来保护(请参阅下一节)。 Andorid Jni doc

    【讨论】:

      【解决方案2】:

      我在我的 android 应用程序中遇到了类似的问题。此外,我发现 String 参数是 JNI 提到的“无效作业”。我尝试输入非空字符串作为参数并且错误消失了。我不知道为什么会这样。我希望它可以帮助您解决问题。

      【讨论】:

      • 我删除了字符串参数并且没有崩溃,所以它绝对是我的字符串。
      【解决方案3】:

      在我的情况下,问题是我使用正确的参数调用本机函数,但返回类型错误

      【讨论】:

        【解决方案4】:

        对我来说,传入的const char * str 参数没有与CallStaticVoidMethod 打球。为了解决这个问题,我们必须创建一个新的 jstring 并将其传递回 Java:

        // str is a const char *
        jstring x = env->NewStringUTF(str);
        env->CallStaticVoidMethod(jclassMainClass, methodId, x);
        env->DeleteLocalRef(x);
        

        这很有意义,因为 JNI 桥接了 C++ 和 Java,并且 Java 只接受 Java 字符串 (jstring) 而不是 const char *,尽管传递后者不会导致编译时错误。

        【讨论】:

          【解决方案5】:

          我也遇到这个问题,情况是使用了错误的.so文件。应该是x86,但我用的是x86_64。

          【讨论】:

            猜你喜欢
            • 2021-04-06
            • 1970-01-01
            • 1970-01-01
            • 2018-01-19
            • 1970-01-01
            • 1970-01-01
            • 2019-12-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多