2010-12-15 12 views
6

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

या

कैसे मैंने पढ़ा है और NDK से एक xml फ़ाइल लिख सकता है?

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

+0

पढ़ सकते हैं और xml फ़ाइल लिखने के लिए कैसे: http://xmlsoft.org/ – ognian

+0

NDK के साथ कोई अनुभव नहीं होने जबकि, मुझे नहीं लगता कि आप संदर्भ का उपयोग कर सकते है। एनडीके विकास समय-महत्वपूर्ण, उच्च प्रदर्शन और निम्न स्तर की चीजों के लिए है। मेरा सुझाव है कि आपको सबसे महत्वपूर्ण कॉन्फ़िगरेशन डेटा चाहिए जो आपको चाहिए और इसे JSON या XML में लिखें और इसे अपने एनडीके कोड से पार्स करें। –

+0

@cppdev अब मुझे भी यही समस्या है, अगर आपने इसे कार्यान्वित किया है, तो क्या आप –

उत्तर

6

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

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

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

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

जैसे:

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

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

+0

साझा कर सकते हैं 'env' चर क्या है? एंड्रॉइड में एक संदर्भ पारित किया गया है? –

+1

@ इगोरगानापोलस्की इसे जेएनआई फ़ंक्शन कॉल में स्पष्ट रूप से एक तर्क के रूप में पारित करने की आवश्यकता नहीं है क्योंकि JVM आंतरिक रूप से इसे पास करता है। Https://en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_works – aasu

1

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

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; 
     } 
} 
+0

मैंने सोचा कि http://journals.ecs.soton.ac.uk/java/ के अनुसार 'GetMethodID' के पैरामीटर सूची में तर्क अंतिम स्थिति में जाते हैं। ट्यूटोरियल/native1.1/लागू करने/method.html। हालांकि, आप पहले पैरामीटर के रूप में 'contextClass' पास कर रहे हैं? –

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