Android:需要在c ++ NDK中创build共享首选项对象,并存储一些布尔值

我是新来的这个不知道如何开始这个,

我创build了一个使用Android.mk链接到C ++的项目

所以当我从java调用一个方法时,它应该将存储布尔值存储到我的共享首选项对象中。

这是我的JNI方法

extern "C" JNIEXPORT void JNICALL Java_com_example_sample_storeBoolean(JNIEnv *env,jobject instance){ //TODO const char *name ="hello"; __android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "***** %s *****", name); } 

正常的日志我已经打印它正在工作,现在只需要创buildsharepreference对象并设置布尔值

 SharedPreferences prefs = context.getSharedPreferences("myprefdata", Context.MODE_PRIVATE); prefs.edit().putBoolean("settingnootification", true).commit(); 

请指导我如何做。 谢谢

 public abstract SharedPreferences getSharedPreferences(String name, int mode); 

需要在c ++中使用这个方法

Solutions Collecting From Web of "Android:需要在c ++ NDK中创build共享首选项对象,并存储一些布尔值"

我只是从JNI调用MainActivity中的saveBoolean(boolean bool) ,并保存了值。 这里是代码:MainActivity

 public class MainActivity extends AppCompatActivity { // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); stringFromJNI(this); } /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ public native void stringFromJNI(MainActivity mainActivity); public void saveBoolean(boolean bool){ SharedPreferences sharedPreferences = this.getSharedPreferences("Test", Context.MODE_PRIVATE); sharedPreferences.edit().putBoolean("testBool",bool).commit(); Log.d("MainActivity","saveBoolean Called "+bool); } 

}

 #include <jni.h> #include <string> extern "C" JNIEXPORT void JNICALL Java_com_android_techgig_sharedpref_MainActivity_stringFromJNI(JNIEnv *env,jobject obj /* this */) { jclass cls = (env)->GetObjectClass(obj); //for getting class jmethodID mid = (env)->GetMethodID(cls, "saveBoolean", "(Z)V"); //for getting method signature, Z for boolean if (mid == 0) return; //will return 0 in case of class not found (env)->CallVoidMethod(obj, mid, true); //now calling actual method printf("native called"); } 

这里是方法签名types

 Signature Java Type Z boolean B byte C char S short I int J long F float D double 

这里是链接探索更多 ..

快乐编码!

我想你想从你的代码中调用Java类。 我build议从你的C ++代码中调用Java。

看看这里:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo032

在这个例子中,你所做的是:

  • Java调用C ++
  • 根据从Java传递的信息,C ++附加到JVM
  • C ++代码从另一个类调用Java代码(在你的情况下,它将是SharedPreferences对象)

这可能是你需要一些帮手类,使事情变得更简单。 例如,PreferencesStorer – 你将得到正确的喜好类,并传递你想要存储的值。

看看这里:

 public static int fun() { System.out.println("From JVM"); return 0; } 

这是你想要调用的方法,但是你想要的是:store(String value,int mode)。

在您的代码(Java)中,您需要创build该对象并将其作为parameter passing给您的C ++代码。 在C ++里面你想调用这个对象的方法。 在JVM内部,它已经在那里 – 准备好被调用。

如果这不是你正在寻找的,我认为你需要提供一些更多的信息,使整个用例更清晰。

与JNI玩得开心

我需要调用一个getSharedPreferences()方法,那么如何调用它并存储布尔值。

所以,我创build了两个简单的方法来存储和检索NDK C ++中的布尔值

MainActivity.java

 public class MainActivity extends Activity { // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("Native"); } private Activity activity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); activity=MainActivity.this; setStoreBoolValues(activity, true); if (getStoreValues(activity)) Log.e("Store Value", " ** true **"); else Log.e("Store Value", " ** false **"); } public native boolean getStoreValues(Activity activity); public native void setStoreBoolValues(Activity activity, boolean flag); } 

在MainActivity中声明的本地方法,也叫我的.so文件

NativeClass.Cpp

 jobject mainClass; jstring spname(JNIEnv *env) { return env->NewStringUTF("sharedstore"); } jstring objectname(JNIEnv *env) { return env->NewStringUTF("boolvaluestore"); } extern "C" JNIEXPORT jboolean JNICALL Java_com_ebizzinfotech_amjad_contentresolverproj_MainActivity_getStoreValues(JNIEnv *env, jobject instance, jobject activity) { jclass spcls = env->FindClass("android/content/SharedPreferences"); jclass contextcls = env->FindClass("android/content/Context"); mainClass = env->NewGlobalRef(activity); jmethodID mid = env->GetMethodID(contextcls, "getSharedPreferences", "(Ljava/lang/String;I)Landroid/content/SharedPreferences;"); jmethodID midbool = env->GetMethodID(spcls, "getBoolean", "(Ljava/lang/String;Z)Z"); jobject jobjectshared = env->CallObjectMethod(mainClass, mid, spname(env), 0); // jobject jobjectsharededit = env->CallObjectMethod(jobjectshared,midedit); jboolean jboolean1 = env->CallBooleanMethod(jobjectshared, midbool,objectname(env), JNI_FALSE); env->DeleteLocalRef(spcls); env->DeleteLocalRef(contextcls); return jboolean1; } extern "C" JNIEXPORT void JNICALL Java_com_ebizzinfotech_amjad_contentresolverproj_MainActivity_setStoreBoolValues(JNIEnv *env, jobject instance, jobject activity, jboolean flag) { jclass spcls = env->FindClass("android/content/SharedPreferences"); jclass speditorcls = env->FindClass("android/content/SharedPreferences$Editor"); jclass contextcls = env->FindClass("android/content/Context"); mainClass = env->NewGlobalRef(activity); jmethodID mid = env->GetMethodID(contextcls, "getSharedPreferences", "(Ljava/lang/String;I)Landroid/content/SharedPreferences;"); jmethodID midedit = env->GetMethodID(spcls, "edit", "()Landroid/content/SharedPreferences$Editor;"); jmethodID midputbool = env->GetMethodID(speditorcls, "putBoolean", "(Ljava/lang/String;Z)Landroid/content/SharedPreferences$Editor;"); jmethodID midapply = env->GetMethodID(speditorcls, "apply", "()V"); jobject jobjectshared = env->CallObjectMethod(mainClass, mid,spname(env), 0); jobject jobjectsharededit = env->CallObjectMethod(jobjectshared, midedit); env->CallVoidMethod(env->CallObjectMethod(jobjectsharededit, midputbool, objectname(env), flag), midapply); env->DeleteLocalRef(spcls); env->DeleteLocalRef(contextcls); env->DeleteLocalRef(speditorcls); }