Amj*_*han 9 c++ java java-native-interface android android-ndk
我是新手,不知道怎么开始这个,
我创建了一个使用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);
}
Run Code Online (Sandbox Code Playgroud)
普通日志我已打印它现在正在工作只需要创建sharepreference对象并设置布尔值
SharedPreferences prefs = context.getSharedPreferences("myprefdata", Context.MODE_PRIVATE);
prefs.edit().putBoolean("settingnootification", true).commit();
Run Code Online (Sandbox Code Playgroud)
请指导我怎么做.谢谢
public abstract SharedPreferences getSharedPreferences(String name, int mode);
Run Code Online (Sandbox Code Playgroud)
需要在c ++中使用此方法
我刚刚saveBoolean(boolean bool)从 JNI 调用 MainActivity,它保存了该值。这是代码: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);
}
Run Code Online (Sandbox Code Playgroud)
}
#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");
}
Run Code Online (Sandbox Code Playgroud)
这是方法签名类型
Signature Java Type
Z boolean
B byte
C char
S short
I int
J long
F float
D double
Run Code Online (Sandbox Code Playgroud)
这是探索更多内容的链接..
快乐编码!
我需要调用 getSharedPreferences() 方法,那么我如何调用它并存储布尔值。
因此,我创建了两种简单的方法来在 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);
}
Run Code Online (Sandbox Code Playgroud)
在 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2130 次 |
| 最近记录: |