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开发的新手。
答案 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 *
,尽管传递后者不会导致编译时错误。