简体   繁体   English

JNI ERROR(app bug):尝试使用陈旧的Local 0x31(应该是0x39)

[英]JNI ERROR (app bug): attempt to use stale Local 0x31 (should be 0x39)

Good day. 美好的一天。 Wrote code that should set key values. 写了应该设置键值的代码。

extern "C" JNIEXPORT jboolean JNICALL Java_com_example_woodman_testlibsettingsv2_frmMain_SetSystemKeysString(JNIEnv *env, jobject instance, jstring key_Name_) { 
    const char *key_Name = env->GetStringUTFChars(key_Name_, 0);

    // TODO

    jclass secClass = env->FindClass("android/provider/Settings$System");
    jmethodID secMid = env->GetStaticMethodID(secClass, "putString", "(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Z");

    jclass activityThread = env->FindClass("android/app/ActivityThread");
    jmethodID currentActivityThread = env->GetStaticMethodID(activityThread, "currentActivityThread", "()Landroid/app/ActivityThread;");
    jobject at = env->CallStaticObjectMethod(activityThread, currentActivityThread);
    jmethodID getApplication = env->GetMethodID(activityThread, "getApplication", "()Landroid/app/Application;");
    jobject context = env->CallObjectMethod(at, getApplication);

    jclass c_context = env->FindClass("android/content/Context");
    jmethodID m_get_content_resolver = env->GetMethodID(c_context, "getContentResolver", "()Landroid/content/ContentResolver;");
    jobject o_content_resolver;
    o_content_resolver = env->CallObjectMethod(context, m_get_content_resolver);

    jstring jStringParam = env->NewStringUTF(key_Name);
    jboolean jStringKey = env->CallStaticBooleanMethod(secClass, secMid, o_content_resolver, jStringParam, env->NewStringUTF("1"));

    env->DeleteLocalRef(jStringParam);

    return jStringKey;
}

But when I try to execute, I get an error. 但是当我尝试执行时,我收到一个错误。

E/stlibsettingsv: JNI ERROR (app bug): attempt to use stale Local 0x31 (should be 0x39)
A/stlibsettingsv: java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0x31
    java_vm_ext.cc:542]     from boolean com.example.woodman.testlibsettingsv2.frmMain.SetSystemKeysString(java.lang.String)
    java_vm_ext.cc:542] "main" prio=5 tid=1 Runnable
A/stlibsettingsv: java_vm_ext.cc:542]   | group="main" sCount=0 dsCount=0 flags=0 obj=0x7968c450 self=0x74e3014c00
    java_vm_ext.cc:542]   | sysTid=32691 nice=-10 cgrp=default sched=0/0 handle=0x7568948548
    java_vm_ext.cc:542]   | state=R schedstat=( 316288736 11800419 156 ) utm=29 stm=2 core=5 HZ=100
    java_vm_ext.cc:542]   | stack=0x7fe34db000-0x7fe34dd000 stackSize=8MB
    java_vm_ext.cc:542]   | held mutexes= "mutator lock"(shared held)
    java_vm_ext.cc:542]   native: #00 pc 00000000003c26c0  /system/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+220)

Can everybody have a problem? 每个人都有问题吗?

I read a lot of forums and websites. 我读了很多论坛和网站。 There is no solution anywhere. 任何地方都没有解决方案。 Thanks. 谢谢。

Add: This line causes an error. 添加:此行导致错误。

jboolean jStringKey = env->CallStaticBooleanMethod(secClass, secMid, o_content_resolver, jStringParam, env->NewStringUTF("1"));

All the rest work out correctly. 所有其余的工作都正确。 The problem with calling the putString method. 调用putString方法的问题。

The culprit of the failure is this line: 失败的罪魁祸首就是这条线:

jmethodID secMid = env->GetStaticMethodID(secClass, "putString", "(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Z");

You are trying to find the static method ID of 您正在尝试查找静态方法ID

protected static boolean putString(ContentResolver resolver, Uri uri, String name, String value)

for class android.provider.Settings$System , but this class does not have such a method at all. 对于类android.provider.Settings$System ,但这个类根本没有这样的方法。

Although, we know 虽然,我们知道

public static final class System extends NameValueTable {
    ...
}

But, this is a static method of class NameValueTable which CANNOT be inherited by System class. 但是,这是类NameValueTable的静态方法,它不能System类继承。

So, you need change the method signature to below: 因此,您需要将方法签名更改为:

jmethodID secMid = env->GetStaticMethodID(secClass, "putString", "(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z");

Note that the ;Landroid/net/Uri is removed from your method signature. 请注意,从您的方法签名中删除了;Landroid/net/Uri

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android ICS:JNI错误尝试使用陈旧的本地引用0x1 - Android ICS : JNI error attempt to use stale local reference 0x1 Unity Android构建因JNI错误(应用程序错误)而崩溃:已访问过时的本地引用0x200001(大小为0的表中的索引0) - Unity Android build crashes with JNI ERROR (app bug): accessed stale local reference 0x200001 (index 0 in a table of size 0) Unity3d开发:JNI错误(app bug):访问陈旧的本地引用0x200001(大小为0的表中的索引0) - Unity3d development: JNI ERROR (app bug): accessed stale local reference 0x200001 (index 0 in a table of size 0) NewStringUTF()/DeleteLocalRef() 产生 JNI 错误(应用程序错误):访问过时的本地 - NewStringUTF()/DeleteLocalRef() produces JNI ERROR (app bug): accessed stale Local JNI ERROR(app bug):访问陈旧的本地引用0xbc00021(大小为8的表中的索引8) - JNI ERROR (app bug): accessed stale local reference 0xbc00021 (index 8 in a table of size 8) 错误:JNI 错误(应用程序错误):访问过时的全局引用 - Error: JNI ERROR (app bug): accessed stale global reference JNI错误(应用错误):访问过时的全局引用 - JNI ERROR (app bug): accessed stale global reference JNI在应用程序中检测到错误:使用已删除的本地引用0x1 - JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0x1 Android JNI陈旧的本地引用错误 - Android JNI stale local reference error JNI ERROR(app bug):本地参考表溢出(max = 512) - JNI ERROR (app bug): local reference table overflow (max=512)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM