2017-07-29 20 views
8

我是新來這個不知道如何下手這個,安卓:需要建立共享偏好在C++ NDK對象和存儲一些布爾值

我已經創建了一個鏈接到C++採用Android項目。 mk

所以當我從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); 
} 

正常登錄我已經印現在是工作纔剛剛創建所需sharepreference對象,並設置布爾值

SharedPreferences prefs = context.getSharedPreferences("myprefdata", Context.MODE_PRIVATE); 

prefs.edit().putBoolean("settingnootification", true).commit(); 

請指導我該怎麼做。 感謝

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

需要在C++中使用此方法

+0

看到'JNIEnv.call *方法(jobject,jmethodID,...)' – pskink

回答

0

我需要調用一個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); 
} 

聲明爲native方法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); 
} 
1

我猜你想從你的代碼中調用Java類。我建議從你的C++代碼中調用Java。

到這裏看看:

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

在此示例中,你要做的就是:基於Java的傳遞信息

  • Java調用C++
  • ,C++重視JVM
  • C++代碼從另一個類調用Java代碼(在你的情況下,它將是SharedPreferences對象)

可能你會需要一些輔助類來使事情更簡單。例如。 PreferencesStorer - 您將獲得適當的偏好類別並傳遞您想要存儲的值。

到這裏看看:

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

這是你要調用的方法,但你希望它是:專賣店(字符串值,INT模式)。

在您的代碼中(Java),您需要創建此對象並將其作爲參數傳遞給您的C++代碼。在C++裏面你想調用這個對象的方法。在JVM內部,它已經存在 - 準備好被調用。

如果這不是您要查找的內容,我認爲您需要提供一些更多信息以使整個使用案例更加清晰。

有樂趣與JNI

+0

謝謝,但我沒有得到我正在尋找從C++創建和抽象方法的調用解** getSharedPreferences(字符串名稱,INT模式); **在java中 –

+1

抽象方法並不意味着它可以從C++調用....作爲@mko說,你需要創建一個Java類,是以布爾作爲參數,並將其存儲在一個方法SharedPreferences,你需要實例化類的一個對象,並把它作爲一個JNI調用參數,然後你可以調用從C++代碼的方法。 –

3

我只是叫MainActivity saveBoolean(boolean bool)從JNI,它保存的價值。 這裏是代碼: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"); 
} 

下面是方法簽名類型

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

這裏是鏈接探索more ..

編碼愉快!

+0

謝謝,你的情況,呼籲從本地,而不是我需要調用一個方法getSharedPreferences Java函數,所以我怎麼能調用和存儲布爾值。 –