Android: Kailangan na lumikha ng mga object na Mga Ibinahagi sa Kasosyo sa c ++ NDK at Mag-imbak ng ilang halaga ng Boolean

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

Ako ay bago sa ito ay hindi alam kung paano simulan ito,

Gumawa ako ng isang proyekto na naka-link sa C ++ gamit Android.mk

Kaya kapag tumawag ako ng isang paraan mula sa java dapat itong gawin ang pagtatago ng boolean na halaga sa aking ibinahaging preference object.

Ito ang aking pamamaraan ng 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);
} 

normal na mag-log ko na naka-print na ito ay gumagana ngayon lamang kailangan lang lumikha ng sharepreference object at itakda ang halaga ng boolean

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

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

Paki-gabay sa akin kung paano gagawin. Salamat

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

Kailangan mong gamitin ang paraan na ito sa c + +

3 Answers


vikas kumar 08/05/2017.

Tinatawag ko lang saveBoolean(boolean bool) sa MainActivity mula sa JNI at ini-save ang halaga. Narito ang code: 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");
} 

Narito ang mga uri ng lagda ng paraan

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

Narito ang link upang masaliksik ang higit pa ..

Maligayang coding !!!


mko 07/31/2017.

Hulaan ko na gusto mong tumawag sa klase ng Java mula sa iyong code. Iminumungkahi kong tawagin ang Java pabalik mula sa iyong C ++ code.

Tingnan dito:

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

Sa halimbawang ito, kung ano ang iyong ginagawa ay:

  • Ang mga tawag sa Java ay C ++
  • Batay sa impormasyon na lumipas mula sa Java, ang C ++ ay nakalagay sa JVM
  • Ang C + + code ay tumatawag sa Java code mula sa isa pang klase (sa iyong kaso, ito ay magiging SharedPreferences object)

Maaaring kakailanganin mo ang ilang klase ng katulong upang gawing simple ang mga bagay. Hal ng Mga Kagustuhan sa Kagustuhan - kung saan makakakuha ka ng tamang mga klase ng kagustuhan at ipasa ang mga halaga na gusto mong iimbak.

Tingnan dito:

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

Ito ang paraan na gusto mong tawagan ngunit gusto mo ito: tindahan (String value, int mode).

Sa iyong code (sa Java) kailangan mong likhain ang bagay na ito at ipasa ito bilang argumento sa iyong C + + code. Sa loob ng C + + gusto mong tumawag sa paraan ng bagay na ito. Sa loob ng JVM ito ay naroroon na - handa nang tawagin.

Kung hindi ito ang iyong hinahanap, sa palagay ko kailangan mong magbigay ng higit pang impormasyon upang gawing mas malinaw ang buong paggamit ng kaso.

Maglibang sa JNI


Amjad Khan 09/06/2017.

Kailangan kong tumawag sa isang getSharedPreferences () na paraan, Kaya paano ko matawagan iyon at mag-imbak ng boolean.

Kaya, gumawa ako ng dalawang simpleng pamamaraan para sa pag-iimbak at pagbawi ng halaga ng boolean sa 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);
} 

Ipinahayag ang Katutubong Paraan sa MainActivity at tinawag din ang aking .so file

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