2017-07-29 10 views
8

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

मैं एक परियोजना है कि C++ से जुड़ा हुआ है Android का उपयोग कर बनाया है। एमके

तो जब मैं जावा से एक विधि को कॉल करता हूं तो इसे मेरे साझा वरीयता ऑब्जेक्ट में भंडारण बूलियन मान करना चाहिए।

सिर्फ sharepreference वस्तु और बूलियन मान सेट बनाने की जरूरत है यह मेरा 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); 

+0

देखें 'JNIEnv.call * विधि (जॉबजेक्ट, jmethodID, ...) ' – pskink

उत्तर

0

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

तो, मैं NDK सी ++

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

घोषित मूल निवासी 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

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

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

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

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

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

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

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

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

इस विधि आप कॉल करना चाहते है लेकिन आप इसे होना चाहते हैं: दुकान (स्ट्रिंग मान, पूर्णांक मोड)।

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

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

मज़ा JNI

+0

धन्यवाद, लेकिन मुझे समाधान नहीं मिला जो मैं सी ++ से अमूर्त विधि बनाने और कॉल करने के लिए खोज रहा हूं ** getSharedPreferences (स्ट्रिंग नाम , int मोड); ** –

+1

जावा में अमूर्त विधि का मतलब यह नहीं है कि इसे सी ++ से बुलाया जा सकता है .... जैसा कि @mko ने कहा था कि आपको एक जावा क्लास बनाने की आवश्यकता है जिसमें बूलियन को तर्क के रूप में लिया जाता है और इसे स्टोर करता है साझा किए गए संदर्भ, आपको कक्षा के किसी ऑब्जेक्ट को तुरंत चालू करने और उसे जेएनआई कॉल में तर्क के रूप में पास करने की आवश्यकता है और फिर आप विधि को C++ कोड से कॉल कर सकते हैं। –

3

साथ मैं सिर्फ JNI से MainActivity में saveBoolean(boolean bool) कहा जाता है और यह मूल्य बचा लिया। यहाँ कोड है: 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 विधि को कॉल करने की आवश्यकता है, तो मैं इसे कैसे कॉल कर सकता हूं और बूलियन स्टोर कर सकता हूं। –

संबंधित मुद्दे