2017-07-29 17 views
8

Tôi mới đến đây không biết làm thế nào để bắt đầu này,Android: Cần tạo Preferences chung đối tượng trong C++ NDK và lưu trữ một số giá trị Boolean

Tôi đã tạo ra một dự án mà được liên kết với C++ sử dụng Android. mk

Vì vậy, khi tôi gọi một phương thức từ java, nó sẽ làm việc lưu trữ giá trị boolean vào đối tượng tùy chọn được chia sẻ của tôi.

Đây là phương pháp JNI tôi

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); 
} 

log bình thường Tôi đã in nó đang làm việc bây giờ chỉ chỉ cần tạo đối tượng sharepreference và thiết lập giá trị boolean

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

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

hãy hướng dẫn cho tôi cách thực hiện. Cảm ơn

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

Cần sử dụng phương pháp này trong C++

+0

xem phương thức 'JNIEnv.call * (jobject, jmethodID, ...)' – pskink

Trả lời

0

Tôi cần gọi phương thức getSharedPreferences(), Vậy làm cách nào tôi có thể gọi và lưu trữ boolean.

Vì vậy, tôi đã tạo ra hai phương pháp đơn giản để lưu trữ và lấy giá trị boolean trong 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); 
} 

Tuyên Native Method trong MainActivity và cũng được gọi là tập tin .so tôi

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

Tôi đoán bạn muốn gọi lớp Java từ mã của bạn. Tôi đề nghị gọi lại Java từ mã C++ của bạn.

Hãy xem ở đây:

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

Trong ví dụ này, những gì bạn làm là:

  • Java gọi C++
  • Dựa trên thông tin truyền từ Java, C++ gắn vào JVM
  • Mã C++ gọi mã Java từ một lớp khác (trong trường hợp của bạn, nó sẽ là đối tượng SharedPreferences)

Có thể bạn sẽ cần một số lớp trợ giúp để làm cho mọi việc đơn giản hơn. Ví dụ. PreferencesStorer - nơi bạn sẽ nhận được các lớp tùy chọn thích hợp và truyền các giá trị bạn muốn lưu trữ.

Hãy xem ở đây:

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

Đây là phương pháp mà bạn muốn gọi nhưng bạn muốn nó được: cửa hàng (String giá trị, chế độ int).

Trong mã của bạn (trong Java), bạn cần phải tạo đối tượng này và chuyển nó làm đối số cho mã C++ của bạn. Bên trong C++ bạn muốn gọi phương thức của đối tượng này. Bên trong JVM nó sẽ có sẵn - sẵn sàng để được gọi.

Nếu đây không phải là những gì bạn đang tìm kiếm, tôi nghĩ bạn cần cung cấp thêm một số thông tin để làm cho toàn bộ trường hợp sử dụng trở nên rõ ràng hơn một chút.

Hãy vui vẻ với JNI

+0

Cảm ơn, Nhưng tôi đã không nhận được giải pháp mà tôi đang tìm kiếm để tạo và gọi phương thức trừu tượng từ C++ ** getSharedPreferences (Tên chuỗi , phương thức int) ** –

+1

phương thức trừu tượng trong java không có nghĩa là nó có thể được gọi từ C++ .... như @mko nói bạn cần tạo một lớp java với một phương thức lấy tham số boolean và lưu nó vào SharedPreferences, Bạn cần phải khởi tạo một đối tượng của lớp và chuyển nó làm đối số trong một cuộc gọi JNI và sau đó bạn có thể gọi phương thức từ mã C++. –

3

Tôi chỉ gọi saveBoolean(boolean bool) trong MainActivity từ JNI và nó lưu lại giá trị. Đây là mã: 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"); 
} 

Dưới đây là phương pháp chữ ký loại

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

Dưới đây là liên kết để khám phá more ..

Chúc mừng mã hóa !!!

+0

Cảm ơn, Trong trường hợp của bạn gọi một hàm java từ gốc hơn là tôi cần gọi phương thức getSharedPreferences, Vậy làm thế nào tôi có thể gọi nó và lưu trữ boolean. –

Các vấn đề liên quan