एनडीके आवेदन में एंड्रॉइड संदर्भ का उपयोग करें

cppdev 12/15/2010. 2 answers, 7.899 views
android android android-ndk android-ndk

क्या कोई तरीका है जिसमें मैं अपने एनडीके एप्लायंस में एंड्रॉइड संदर्भ का ऑब्जेक्ट पास / प्राप्त कर सकता हूं। मैं jni इंटरफ़ेस के माध्यम से अपने SharedPreferences अनुप्रयोग में SharedPreferences का उपयोग करना चाहता हूं। SharedPreferences ऑब्जेक्ट का उदाहरण प्राप्त करने के लिए, मुझे Context ऑब्जेक्ट पर getSharedPreferences() को कॉल करने की आवश्यकता है। लेकिन मेरे पास संदर्भ वस्तु तक पहुंच नहीं है।

या

मैं एनडीके से एक एक्सएमएल फ़ाइल कैसे पढ़ और लिख सकता हूं?

किसी भी पॉइंटर्स की सराहना की जाएगी।

3 Comments
ognian 12/15/2010
Xml फ़ाइल को कैसे पढ़ और लिखना है: xmlsoft.org
Sebastian Roth 12/15/2010
एनडीके के साथ कोई अनुभव नहीं होने पर, मुझे नहीं लगता कि आप संदर्भ तक पहुंच सकते हैं। एनडीके विकास समय-महत्वपूर्ण, उच्च प्रदर्शन और निम्न स्तर की चीजों के लिए है। मेरा सुझाव है कि आपको सबसे महत्वपूर्ण कॉन्फ़िगरेशन डेटा चाहिए जो आपको चाहिए और इसे JSON या XML में लिखें और इसे अपने एनडीके कोड से पार्स करें।
Mr.Cool 05/22/2013
@cppdev अब मुझे भी यही समस्या है, अगर आपने इसे कार्यान्वित किया है, तो आप साझा कर सकते हैं

2 Answers


Lucas S. 12/22/2010.

ऐसा कुछ भी नहीं है जो आपको करना है, यह नियमित जेएनआई तंत्र की तरह है। आपको संदर्भ ऑब्जेक्ट में पॉइंटर प्राप्त करने की आवश्यकता है, फिर उस विधि आईडी को पुनर्प्राप्त करें जिसे आप कॉल करना चाहते हैं और फिर उसे इच्छित तर्कों के साथ आमंत्रित करें।

बेशक शब्दों में यह सुपर सीधा लगता है, लेकिन कोड में यह सभी चेक और जेएनआई कॉल के बाद वास्तव में गन्दा हो जाता है।

तो मेरी राय में मैं मूल / जेएनआई कोड से पूरी चीज को लागू करने की कोशिश नहीं करूंगा, इसके बजाय मैं जावा में एक सहायक विधि लागू करूंगा जो सभी चीजें बनाता है और वरीयता को पढ़ने / लिखने के लिए आवश्यक डेटा प्राप्त करता है।

यह आपके मूल कोड को बहुत सरल बना देगा और इससे इसे बनाए रखना आसान हो जाएगा।

उदाहरण के लिए:

//Somewhere inside a function in your native code
void Java_com_example_native_MainActivity_nativeFunction(JNIEnv* env, jobject thiz)
{
    jclass cls = (*env)->FindClass(env,"PreferenceHelper");
    if (cls == 0) printf("Sorry, I can't find the class");

    jmethodID set_preference_method_id;

    if(cls != NULL)
    {
        set_preference_method_id = (*env)->GetStaticMethodID(env, cls, "setPreference", "(Ljava/lang/String;Ljava/lang/StringV");

        if(set_preference_method_id != NULL )
        {
            jstring preference_name = (*env)->NewStringUTF(env, "some_preference_name");
            jstring value = (*env)->NewStringUTF(env, "value_for_preference");

            (*env)->CallStaticVoidMethod(env, cls, get_main_id, preference_name, value);
        }
    }
} 

ध्यान दें कि मैंने बस स्मृति से कोड लिखा है इसलिए बॉक्स से बाहर काम न करने की उम्मीद है।

2 comments
Igor Ganapolsky 04/12/2016
env परिवर्तनीय क्या है? एंड्रॉइड में एक संदर्भ पारित किया गया है?
1 aasu 09/08/2016
@IgorGanapolsky इसे जेएनआई फ़ंक्शन कॉल में स्पष्ट रूप से एक तर्क के रूप में पारित करने की आवश्यकता नहीं है क्योंकि JVM आंतरिक रूप से इसे पास करता है। En.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s देखें

dev 02/16/2016.

ऐसा लगता है कि हाल ही में चीजें बदल गई हैं और उपरोक्त समाधान और अन्य एसओ पदों पर पोस्ट किए गए कुछ अन्य मेरे लिए काम नहीं करते हैं। कुछ प्रयासों के बाद मैं निम्नलिखित समाधान कार्य करने में सक्षम था। मेरा लक्ष्य संदर्भ वस्तु को जेएनआई में पास करना था और पूर्ण भंडारण पथ प्राप्त करना था।

void Java_com_path_to_my_class_jniInit(JNIEnv* env, jobject thiz, jobject contextObject) {

    try {
         //Get Context Class descriptor
         jclass contextClass = env->FindClass("android/content/Context");
         //Get methodId from Context class
         jmethodID getFilesDirMethodId = env->GetMethodID(contextClass,"getFilesDir","()Ljava/io/File;");

         //Call method on Context object which is passed in
         jobject fileObject = env->CallObjectMethod(contextObject,getFilesDirMethodId);

         //Get File class descriptor
         jclass fileClass = env->FindClass("java/io/File");
         //Get handle to the method that is to be called
         jmethodID absolutePathMethodId = env->GetMethodID(fileClass,"getAbsolutePath","()Ljava/lang/String;");
         //Call the method using fileObject
         jstring stringObject = (jstring)env->CallObjectMethod(fileObject,absolutePathMethodId);
      }
      catch(exception& ex){
            JNIExceptionHelper::throwException(env, ex.what());
            return;
      }
} 
1 comments
Igor Ganapolsky 04/12/2016
मैंने सोचा कि GetMethodID के लिए पत्रिकाओं की सूची में अंतिम स्थिति में तर्क मिलता है journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementin g / ... के अनुसार। हालांकि, आप contextClass को पहले पैरामीटर के रूप में पास कर रहे हैं?

Related questions

Hot questions

Language

Popular Tags