2012-06-19 19 views
6

में एसेटमैनेजर का उपयोग करके मुझे सी/सी ++ कोड के भीतर से अपने संपत्ति फ़ोल्डर में संपत्तियों के साथ काम करने की आवश्यकता है। इसे इस तरह AAssetManager सूचक कैश करने के लिए सुरक्षित है ...:एंड्रॉइड एनडीके - देशी कोड

AAssetManager* assetMgr = NULL; 

void Java_com_example_createAssetManager(JNIEnv* env, jclass clazz, jobject assetManager) 
{ 
    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager); 
    assert(NULL != mgr); 
    assetMgr = mgr;  
} 

... और फिर इसका इस्तेमाल करने के लिए जब भी मैं इसे ज़रूरत है? CreateAssetManager को मुख्य गतिविधि (यूआई थ्रेड) के क्रोट विधि पर जावा से बुलाया जाता है लेकिन सी/सी ++ में उपयोग तब होता है जब जीएलएसयूफेस व्यू कार्यान्वयन में देशी तरीकों से नाटकीय रूप से प्रसंस्करण और गेम टिक को संसाधित किया जाता है।

1) क्या परिसंपत्ति एमजी पॉइंटर वैध ऑब्जेक्ट के लिए वैध ऑब्जेक्ट को इंगित करेगा? क्या यह जावा पक्ष (गतिविधि वर्ग में) पर स्थैतिक चर की तरह बनाने के लिए पर्याप्त है, इसलिए कचरा कलेक्टर इसे नष्ट नहीं करेगा?

2) क्या कोई खतरा है कि मैं धागे के साथ कुछ समस्याओं में भाग जाऊंगा?

धन्यवाद, संपत्ति प्रबंधक कैश करने के लिए टॉम एटम

+0

सुरक्षित पक्ष पर एरर और कैश न करें। 'AAssetManager_fromJava()' बहुत तेज़ है। –

+0

उत्तर के लिए धन्यवाद। कारण मैं इसे कैश करना चाहता था यह था कि मुझे नहीं पता कि विधि कॉल में "जॉबजेक्ट एसेट मैनेजर" के बिना पॉइंटर कैसे प्राप्त करें। तो, क्या मुझे इस पैरामीटर को जावा से सी/सी ++ में हर टिक कॉल में जोड़ना होगा, अगर मुझे टिक के दौरान इसकी आवश्यकता होगी? या जब मैं इसकी आवश्यकता हो तो ऑब्जेक्ट के लिए जावा से क्वेरी कैसे कर सकता हूं (AssetManager के लिए जावा से पूछें, फिर AAssetManager_fromJava को कॉल करें, फिर इसका उपयोग करें ...) –

उत्तर

3

एक मामूली सुरक्षित तरीके से कैश की गई AAssetManager सूचक के साथ सी तरफ अंतर्निहित जावा वस्तु के लिए एक वैश्विक संदर्भ धारण करने के लिए किया जाएगा। कम से कम इसके साथ आप जानते होंगे कि सी ऑब्जेक्ट के पीछे/पीछे जावा ऑब्जेक्ट कचरा नहीं होगा।

ऐसा करने के लिए, पर कॉल करें।

और थ्रेड सीमा में परिसंपत्ति प्रबंधक तक पहुंचने के बजाय पागल, IMHO होगा। यह एक बहुत मजबूत डिजाइन बाधा है - जब तक कि स्पष्ट रूप से दस्तावेज नहीं किया जाता है, थ्रेड सुरक्षा को डिफ़ॉल्ट रूप से कभी नहीं माना जा सकता है।

2

मैंने एक एनडीके मॉड्यूल लिखा है, Assetbridge, ताकि आप भी उपयोगी पा सकें। यह आपके प्रोजेक्ट की संपत्ति/फ़ोल्डर (फाइलें और निर्देशिका) की सामग्री को एक अस्थायी निर्देशिका में निर्यात करता है, और उसके बाद उस पथ पर एक पर्यावरण चर सेट करता है, इसलिए आपका मूल कोड temp निर्देशिका में chdir() कर सकता है और आप नियमित पुराने मानक का उपयोग कर सकते हैं लाइब्रेरी फ़ाइल आईओ रूटीन।

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