JNI在应用程序中检测到错误:使用无效的作业

时间:2017-08-15 22:06:35

标签: android-ndk

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:   art / runtime / java_vm_ext.cc:410]来自long   com.hexample.myndkapplication.MyOpaqueBasedJSONDict.nativeGetJSOBObject

任何线索如何调试ndk中的无效内存错误。我是Android和ndk开发的新手。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在我的情况下,问题是我在调用带有严格参数但返回类型错误的本机函数

答案 3 :(得分:0)

在我的情况下,我在多个本机线程中使用了jobject:

javaCallBackObj = env->NewGlobalRef(jobj);

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

答案 4 :(得分:0)

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

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

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