JNI 实现 SharedPreferences 读写

版权声明:转载请写明出处,谢谢! https://blog.csdn.net/wilson1068/article/details/88554516

JNI 实现 SharedPreferences 读写

关于 SharedPreferences 的介绍,可以看以下文章。

【Android】SharedPreferences 存储

JNI 想要实现 SharedPreferences 的读写访问,需要调用对应的 Android 接口。

获取 SharedPreferences 对象

【 Android 】实现

private static final String PREFS_NAME = "TEST_SharedPreferences";
private static SharedPreferences mSharedPreferences = null;

@Override
protected void onCreate(Bundle state){
    super.onCreate(state);

    ...

    // Restore preferences
    mSharedPreferences = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
}

【 JNI 】实现

#define SHARED_PREFERENCES_FILE_NAME                "TEST_SharedPreferences"

jobject LicenseInfo::GetSharedPreferences(JNIEnv * env, char * fileName) {
    jclass      cls_ContextWrapper      = env->FindClass("android/content/ContextWrapper");
    jclass      cls_Context             = env->FindClass("android/content/Context");
    jmethodID   mid_getSharedPreferences= env->GetMethodID(cls_ContextWrapper,
                    "getSharedPreferences", "(Ljava/lang/String;I)Landroid/content/SharedPreferences;");
    jfieldID    fid_MODE_PRIVATE        = env->GetStaticFieldID(cls_Context, "MODE_PRIVATE", "I");
    jint        int_MODE_PRIVATE        = env->GetStaticIntField(cls_Context, fid_MODE_PRIVATE);
    jobject     obj_context             = DeviceInfo::getInstance()->getGlobalContext(env);
    jstring     str_SPFileName          = Cstr2JString(env, fileName);
    jobject     obj_sharedPreferences   = env->CallObjectMethod(obj_context,
                    mid_getSharedPreferences, str_SPFileName, int_MODE_PRIVATE);

    env->DeleteLocalRef(cls_ContextWrapper);
    env->DeleteLocalRef(cls_Context);
    env->DeleteLocalRef(obj_context);
    env->DeleteLocalRef(str_SPFileName);

    return obj_sharedPreferences;
}

// jobject mSharedPreferences = GetSharedPreferences(env, SHARED_PREFERENCES_FILE_NAME);

读取 SharedPreferences 字符串

【 Android 】实现

String strName = mSharedPreferences.getString("Name", "");

【 JNI 】实现

std::string LicenseInfo::GetSharedPreferencesString(JNIEnv * env, char * fileName, char * keyName, const char * defValue) {
    jclass      cls_SharedPreferences   = env->FindClass("android/content/SharedPreferences");
    jmethodID   mid_getString           = env->GetMethodID(cls_SharedPreferences,
                    "getString", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
    jobject     obj_sharedPreferences   = GetSharedPreferences(env, fileName);
    jstring     str_keyLicense          = Cstr2JString(env, keyName);
    jstring     str_keyLicenseDefValue  = Cstr2JString(env, defValue);
    jstring     str_keyLicenseValue     = (jstring) env->CallObjectMethod(obj_sharedPreferences,
                    mid_getString, str_keyLicense, str_keyLicenseDefValue);

    std::string strResult               = JString2String(env, str_keyLicenseValue);

    env->DeleteLocalRef(cls_SharedPreferences);
    env->DeleteLocalRef(obj_sharedPreferences);
    env->DeleteLocalRef(str_keyLicense);
    env->DeleteLocalRef(str_keyLicenseDefValue);
    env->DeleteLocalRef(str_keyLicenseValue);

    return strResult;
}

// std::string strName = GetSharedPreferencesString(env, SHARED_PREFERENCES_FILE_NAME, "Name", "");

写入 SharedPreferences 字符串

【 Android 】实现

SharedPreferences.Editor edit = mSharedPreferences.edit();
edit.putString("Name", "wilson1068");
edit.commit();

【 JNI 】实现

bool LicenseInfo::SetSharedPreferencesString(JNIEnv * env, char * fileName, char * keyName, const char * value) {
    jclass      cls_SharedPreferences   = env->FindClass("android/content/SharedPreferences");
    jclass      cls_SharedPreferencesEditor = env->FindClass("android/content/SharedPreferences$Editor");
    jmethodID   mid_edit                = env->GetMethodID(cls_SharedPreferences,
                    "edit", "()Landroid/content/SharedPreferences$Editor;");
    jmethodID   mid_putString           = env->GetMethodID(cls_SharedPreferencesEditor,
                    "putString", "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;");
    jmethodID   mid_commit              = env->GetMethodID(cls_SharedPreferencesEditor, "commit", "()Z");
    jobject     obj_sharedPreferences   = GetSharedPreferences(env, fileName);
    jobject     obj_editor              = env->CallObjectMethod(obj_sharedPreferences, mid_edit);
    jstring     str_keyLicense          = Cstr2JString(env, keyName);
    jstring     str_value               = Cstr2JString(env, value);
    env->CallObjectMethod(obj_editor, mid_putString, str_keyLicense, str_value);
    jboolean    jb_commit               = env->CallBooleanMethod(obj_editor, mid_commit);

    env->DeleteLocalRef(cls_SharedPreferences);
    env->DeleteLocalRef(cls_SharedPreferencesEditor);
    env->DeleteLocalRef(obj_sharedPreferences);
    env->DeleteLocalRef(obj_editor);
    env->DeleteLocalRef(str_keyLicense);
    env->DeleteLocalRef(str_value);

    return jb_commit;
}

// std::string strName = SetSharedPreferencesString(env, SHARED_PREFERENCES_FILE_NAME, "Name", "wilson1068");

猜你喜欢

转载自blog.csdn.net/wilson1068/article/details/88554516
今日推荐