java.lang.NoSuchFieldError: нет "Ljava / lang / String;"поле JNI - PullRequest
0 голосов
/ 19 ноября 2018

Добрый день.Пожалуйста, скажите мне, что я делаю не так.Реализовано получение ключей от Android / провайдера / Настройки $ System.Такие ключи, как ACCELEROMETER_ROTATION, выглядят без проблем (те, которые описаны https://developer.android.com/reference/android/provider/Settings.System), но такие, как sms_delivered_sound, он отказывается искать. Пишет ошибку.

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.woodman.testlibsettingsv2, PID: 31133
    java.lang.NoSuchFieldError: no "Ljava/lang/String;" field "sms_delivered_sound" in class "Landroid/provider/Settings$System;" or its superclasses
        at com.example.woodman.testlibsettingsv2.frmMain.GetSystemKyesString(Native Method)
        at com.example.woodman.testlibsettingsv2.frmMain.onCreate(frmMain.java:32)
        at android.app.Activity.performCreate(Activity.java:7210)
        at android.app.Activity.performCreate(Activity.java:7201)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2926)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6806)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

код

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

    // TODO
    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_settings_system = env->FindClass("android/provider/Settings$System");
    jclass c_context = env->FindClass("android/content/Context");
    if (c_settings_system == NULL || c_context == NULL) {
        return NULL;
    }
    jmethodID m_get_content_resolver = env->GetMethodID(c_context, "getContentResolver",
                                                        "()Landroid/content/ContentResolver;");
    if (m_get_content_resolver == NULL) {
        return NULL;
    }

    jfieldID f_android_string_key = env->GetStaticFieldID(c_settings_system,
                                                          key_Name,
                                                          "Ljava/lang/String;");

    if (f_android_string_key == NULL) {
        return NULL;
    }
    jstring s_android_string_key = (jstring) env->GetStaticObjectField(c_settings_system,
                                                                       f_android_string_key);


    jobject o_content_resolver;
    o_content_resolver = env->CallObjectMethod(context,
                                               m_get_content_resolver);
    if (o_content_resolver == NULL || s_android_string_key == NULL) {
        return NULL;
    }

    jmethodID m_get_string = env->GetStaticMethodID(c_settings_system, "getString",
                                                    "(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");

    if (m_get_string == NULL) {
        return NULL;
    }

    jstring string_key = (jstring) env->CallStaticObjectMethod(c_settings_system,
                                                                       m_get_string,
                                                                       o_content_resolver,
                                                                       s_android_string_key);
    return string_key;
}

спасибо

1 Ответ

0 голосов
/ 19 ноября 2018

Это значение не является частью системных настроек. На самом деле, его можно найти в miui Framework , но не в других системах Android.

Нет открытого API для чтения этого параметра, ни в C ++, ни в Java. Но мы знаем, что это значение записывается в файл system / build.prop в формате простой ключ = значение.

Этот файл доступен для чтения всем. Вам не нужен JNI для его чтения, обычные C ++ или даже C файловые API-интерфейсы будут работать отлично.

Более гибкий подход заключается в запуске команды settings из вашего кода.

...