2011-12-15 9 views
5

पर कुछ पढ़ने-योग्य बाइट्स को पार करने का सबसे प्रभावी तरीका मेरे पास एक एंड्रॉइड प्रोजेक्ट है (एंड्रॉइड 1.6 और ऊपर लक्षित) जिसमें सी/सी ++ में लिखे गए मूल कोड शामिल हैं, जो एनडीके के माध्यम से पहुंचे हैं। मैं सोच रहा हूं कि जावा से एनडीके के माध्यम से मेरी जेएनआई गोंद परत में बाइट्स की सरणी को पार करने का सबसे प्रभावी तरीका क्या है। मेरी चिंता यह है कि एंड्रॉइड के लिए एनडीके बाइट्स की सरणी की प्रतिलिपि बनायेगा या सिर्फ मुझे प्रत्यक्ष संदर्भ देगा। मुझे सी ++ स्तर पर बाइट्स तक केवल पढ़ने की आवश्यकता है, इसलिए दृश्यों के पीछे कोई प्रतिलिपि मेरे परिप्रेक्ष्य से समय बर्बाद हो जाएगी।एंड्रॉइड: देशी सी ++

वेब पर इस बारे में जानकारी ढूंढना आसान है, लेकिन मुझे यकीन नहीं है कि सबसे प्रासंगिक जानकारी क्या है। उदाहरण:

Get the pointer of a Java ByteBuffer though JNI

http://www.milk.com/kodebase/dalvik-docs-mirror/docs/jni-tips.html

http://elliotth.blogspot.com/2007/03/optimizing-jni-array-access.html

तो किसी को पता है सबसे अच्छा (सबसे कुशल, कम से कम नकल) जिस तरह से वर्तमान NDK में यह करने के लिए क्या है? GetByteArrayRegion? GetByteArrayElements? कुछ और?

उत्तर

5

प्रलेखन के अनुसार, GetDirectBufferAddress आपको सरणी की प्रतिलिपि किए बिना संदर्भ देगा।

हालांकि, इस फ़ंक्शन को कॉल करने के लिए आपको एक साधारण बाइट सरणी के बजाय ByteBuffer.allocateDirect() के साथ direct buffer आवंटित करने की आवश्यकता है। यह explained here के रूप में एक समकक्ष है:

एक सीधा बाइट बफर इस वर्ग की allocateDirect कारखाने विधि लागू द्वारा बनाई जा सकती है। इस विधि द्वारा लौटाए गए बफर आमतौर पर गैर-प्रत्यक्ष बफर से कुछ हद तक अधिक आवंटन और वितरण स्थान हैं। प्रत्यक्ष बफर की सामग्री सामान्य कचरा-एकत्रित ढेर के के बाहर रह सकती है, और इसलिए पर उनके प्रभाव के अनुप्रयोग के स्मृति पदचिह्न स्पष्ट नहीं हो सकते हैं। इसलिए इसलिए अनुशंसा की जाती है कि प्रत्यक्ष बफर मुख्य रूप से बड़े, लंबे समय तक रहने वाले बफर के लिए आवंटित किए जाएंगे जो अंतर्निहित सिस्टम के मूल I/O संचालन के अधीन हैं। आम तौर पर यह सीधे बफर आवंटित करने के लिए सबसे अच्छा होता है जब वे प्रोग्राम प्रदर्शन में एक मापनीय लाभ प्राप्त करते हैं।

+0

क्या विपरीत करने के लिए कोई समान कुशल API है? - मूल परत से जावा परत से 'बाइट []' या 'बाइटबफर' के रूप में 'हस्ताक्षरित char * 'गुजर रहा है? –

+0

दोनों प्रत्यक्ष बाइटबफर और बाइट [] दोनों को देशी पक्ष से पढ़ने/लिखने के लिए उपयोग किया जा सकता है। एक बार जब आप env-> GetDirectBufferAddress (buffer) या env-> ArrayElements (array, ...) प्राप्त करते हैं, तो आप सी/मेमकोपी फ़ंक्शन को पढ़ने/कॉपी करने के लिए उपयोग कर सकते हैं। लेकिन सीधे बाइटबफर बहुत तेज़ है, प्रतियां नहीं खेलें, इसकी सुरक्षित, आदि इत्यादि –

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