एंड्रॉइड: सी ++ एनडीके में साझा प्राथमिकता ऑब्जेक्ट बनाने और कुछ बूलियन मान स्टोर करने की आवश्यकता है

Amjad Khan 07/29/2017. 3 answers, 887 views
java android android c++ android-ndk android-ndk 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);
} 

सामान्य लॉग मैंने मुद्रित किया है कि यह अभी काम कर रहा है केवल शेयरपेरेंस ऑब्जेक्ट बनाने और बूलियन मान सेट करने की आवश्यकता है

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

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

कृपया मुझे मार्गदर्शन करें कि कैसे करें। धन्यवाद

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

सी ++ में इस विधि का उपयोग करने की आवश्यकता है

3 Answers


vikas kumar 08/05/2017.

मैंने जेएनआई से मेनएक्टिविटी में saveBoolean(boolean bool) को बुलाया और यह मूल्य बचाया। यहां कोड है: मुख्य गतिविधि

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

यहां विधि हस्ताक्षर प्रकार हैं

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

अधिक जानने के लिए लिंक यहाँ है ..

हैप्पी कोडिंग !!!


mko 07/31/2017.

मुझे लगता है कि आप जावा कोड को अपने कोड से कॉल करना चाहते हैं। मैं जावा को अपने सी ++ कोड से वापस कॉल करने का सुझाव देता हूं।

यहां एक नज़र डालें

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

इस नमूने में, आप क्या करते हैं:

  • जावा सी ++ कॉल करता है
  • जावा से पारित जानकारी के आधार पर, सी ++ जेवीएम से जुड़ा हुआ है
  • सी ++ कोड किसी अन्य वर्ग से जावा कोड को कॉल करता है (आपके मामले में, यह SharePreferences ऑब्जेक्ट होगा)

चीजों को आसान बनाने के लिए आपको कुछ सहायक वर्ग की आवश्यकता होगी। जैसे प्राथमिकताएं - जहां आपको उचित प्राथमिकताएं कक्षाएं मिलेंगी और वे मान जिन्हें आप स्टोर करना चाहते हैं।

यहां एक नज़र डालें

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

यह वह तरीका है जिसे आप कॉल करना चाहते हैं लेकिन आप इसे होना चाहते हैं: स्टोर (स्ट्रिंग मान, int मोड)।

आपके कोड (जावा में) में आपको इस ऑब्जेक्ट को बनाने और इसे अपने C ++ कोड पर तर्क के रूप में पास करने की आवश्यकता है। सी ++ के अंदर आप इस ऑब्जेक्ट की विधि को कॉल करना चाहते हैं। जेवीएम के अंदर यह पहले से ही होगा - कॉल करने के लिए तैयार है।

यदि यह वह नहीं है जिसे आप ढूंढ रहे हैं, तो मुझे लगता है कि आपको पूरे उपयोग-मामले को थोड़ा और स्पष्ट करने के लिए कुछ और जानकारी प्रदान करने की आवश्यकता है।

जेएनआई के साथ मजा करो


Amjad Khan 09/06/2017.

मुझे getSharedPreferences () विधि को कॉल करने की आवश्यकता है, तो मैं इसे कैसे कॉल कर सकता हूं और बूलियन स्टोर कर सकता हूं।

इसलिए, मैंने एनडीके सी ++ में बूलियन मान को संग्रहीत करने और पुनर्प्राप्त करने के लिए दो सरल विधियां बनाई हैं

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

मुख्य गतिविधि में मूल विधि घोषित की और मेरी .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);
} 

Related questions

Hot questions

Language

Popular Tags