版权声明:转载请写明出处,谢谢! https://blog.csdn.net/wilson1068/article/details/88554516
JNI 实现 SharedPreferences 读写
关于 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");