Android ndk JNI在应用程序中检测到错误:使用无效的jobject 公共类MyOpaqueBasedJSONDict实现IMyJSONDict{ 私人最终long_Mynativecpobj; ... 公共IMyJSONDict getMyJSONObj(字符串键名){ long retVal=nativeGetJSOBObject(_mynativecpobj,keyName); 返回(新MyOpaqueBasedJSONDict(retVal)); } 本机实现 尼Export jlong JNICALL Java_com_hexample_myndkapplication_MyOpaqueBasedJSONDict_NativeGetJSoObject(JNIEnv, jobject实例, jlong Mynativecpobj, jstring键名(U){ const char*keyName=env->GetStringUTFChars(keyName,0); Json::Value*nativecpjson_ptr=reinterpret_cast(mynativecpobj); Json::Value&map=*nativecpjson\u ptr; Json::Value&jsonVal=map[keyName]; env->ReleaseStringUTFChars(关键字名称,关键字名称); return(jlong)和jsonVal; }

Android ndk JNI在应用程序中检测到错误:使用无效的jobject 公共类MyOpaqueBasedJSONDict实现IMyJSONDict{ 私人最终long_Mynativecpobj; ... 公共IMyJSONDict getMyJSONObj(字符串键名){ long retVal=nativeGetJSOBObject(_mynativecpobj,keyName); 返回(新MyOpaqueBasedJSONDict(retVal)); } 本机实现 尼Export jlong JNICALL Java_com_hexample_myndkapplication_MyOpaqueBasedJSONDict_NativeGetJSoObject(JNIEnv, jobject实例, jlong Mynativecpobj, jstring键名(U){ const char*keyName=env->GetStringUTFChars(keyName,0); Json::Value*nativecpjson_ptr=reinterpret_cast(mynativecpobj); Json::Value&map=*nativecpjson\u ptr; Json::Value&jsonVal=map[keyName]; env->ReleaseStringUTFChars(关键字名称,关键字名称); return(jlong)和jsonVal; },android-ndk,Android Ndk,我不明白为什么我会 JNI在应用程序中检测到错误:使用无效的jobject 0xb4019a80 08-16 03:25:56.785 20537-20537/com.hexample.myndkapplication A/art: 来自long的art/runtime/java_vm_ext.cc:410] com.hexample.myndkapplication.MyOpaqueBasedJSONDict.nativeGetJSOBObject 任何关于如何调试ndk中无效内存错误的线索。

我不明白为什么我会

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


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

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

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

在我的例子中,问题是我用righ调用了本机函数参数但返回类型错误在我的例子中,我在多本机线程中使用了jobject:

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;
}
但是请注意,jclass是一个类引用,必须通过调用NewGlobalRef来保护它(请参阅下一节)。


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

javaCallBackObj = env->NewGlobalRef(jobj);

桥的C++和java和java只接受java字符串(<代码> jstring < /COD> >),而不是<代码> const char */COM>,尽管传递后者不会造成编译时错误。

我删除了字符串参数,没有崩溃,所以它也绝对是我的字符串。
// str is a const char *
jstring x = env->NewStringUTF(str);
env->CallStaticVoidMethod(jclassPixelCode, methodId, x);
env->DeleteLocalRef(x);