Android: Cần tạo đối tượng Tùy chọn chia sẻ trong c ++ NDK và Lưu trữ giá trị Boolean

Amjad Khan 29/07/2017. 3 answers, 887 views
java android android c++ android-ndk android-ndk jni

Tôi mới biết điều này không biết bắt đầu như thế nào,

Tôi đã tạo một dự án được liên kết với C ++ bằ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 cho đối tượng sở thích được chia sẻ của tôi.

Đây là phương pháp JNI của 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);
} 

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

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

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

Hãy hướng dẫn tôi cách làm. Cảm ơn

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

Cần sử dụng phương thức này trong c ++

3 Answers


vikas kumar 05/08/2017.

Tôi chỉ gọi là saveBoolean(boolean bool) trong MainActivity từ JNI và nó đã lưu 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 #include 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à các loại chữ ký phương thức

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

Đây là liên kết để khám phá thêm ..

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


mko 31/07/2017.

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 mẫu này, những gì bạn làm là:

  • Java gọi C ++
  • Dựa trên thông tin được chuyể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)

Nó có thể là 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 sở thích 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 thức bạn muốn gọi nhưng bạn muốn nó là: store (String value, int mode).

Trong mã của bạn (trong Java), bạn cần 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.

Vui chơi với JNI


Amjad Khan 06/09/2017.

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.

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

Khai báo phương thức gốc trong MainActivity và cũng được gọi là tệp .so của 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);
} 

Related questions

Hot questions

Language

Popular Tags