Dalvik

2013-02-27 5 views
11

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

समस्या - मेरी एआईडीएल फ़ाइल में एक एपीआई है जिसे initFrame (बाइट [] फ्रेम में) कहा जाता है। जब भी मैं इस एपीआई को एक एप्लीकेशन (एक अलग प्रक्रिया में चल रहा हूं) से कॉल करता हूं, तो मुझे एक अपवाद मिलता है - TransactionTooLargeException

ऐसा इसलिए है क्योंकि बाइट सरणी का आकार> 1 एमबी है और बाइंडर लेनदेन बफर का सीमित निश्चित आकार 1 एमबी है । यहां तक ​​कि यदि आकार सीमा बड़ी थी, तो वास्तविक समय प्रसंस्करण के लिए बड़े बफर की प्रतिलिपि बनाना बहुत अक्षम है।

प्रश्न - क्या एंड्रॉइड में दो दल्विक प्रक्रियाओं के बीच स्मृति साझा करने का कोई तरीका है जो समस्या को हल करने में मदद कर सकता है? मैंने MemoryFile देखा लेकिन ऐसा लगता है कि मेमोरीफ़ाइल का उपयोग केवल इस बिंदु पर छिपा एपीआई का उपयोग करके प्रक्रियाओं के बीच स्मृति साझा करने के लिए किया जा सकता है।

उत्तर

3

मैं इस प्रकार के लेनदेन के लिए 2 प्रक्रियाओं के बीच सॉकेट कनेक्शन का उपयोग करूंगा। दोनों पक्ष बहुत सारे संसाधनों को बगैर, आवश्यकतानुसार डेटा और बफर स्ट्रीम कर सकते हैं। यह आपकी सेवा के लिए सॉकेट पर सुनने और क्लाइंट को सॉकेट से कनेक्ट करने और डेटा भेजने के लिए अपेक्षाकृत आसान होना चाहिए।

3

ashmem सबसिस्टम पर एक नज़र डालें जो एक साझा स्मृति आवंटक है, जो पॉज़िक्स एसएचएम के समान है लेकिन विभिन्न व्यवहार और एक सरल फ़ाइल-आधारित एपीआई खेल रहा है।

शायद यह आप के लिए क्या देख रहे है:

int ashmem_create_region(const char *name, size_t size); 
int ashmem_set_prot_region(int fd, int prot); 
int ashmem_pin_region(int fd, size_t offset, size_t len); 
int ashmem_unpin_region(int fd, size_t offset, size_t len); 
int ashmem_get_size_region(int fd); 

इस system/core/include/cutils/ashmem.h में परिभाषित किया गया है।

+1

मैंने ashmem देखा लेकिन मेरे जावा एप्लिकेशन में ashmem का उपयोग कैसे करें? मैं एनडीके के साथ आवेदन बोझ नहीं करना चाहता। –

+1

यह एक ऐसा एप्लिकेशन है जो दिखाता है कि विभिन्न अनुप्रयोगों/मूल सी और जावा के बीच mmap को ashmem का उपयोग कैसे करें। https://github.com/vecio/AndroidIPC – user3387542

3

यदि आप एंड्रॉइड सिस्टम को संशोधित करने में सक्षम हैं, तो आप लेनदेन के आकार को बढ़ा सकते हैं। बाइंडर लेनदेन बफर एक सीमित तय आकार, वर्तमान में 1 एमबी

वहाँ ProcessState.cpp

#define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2)) 

यह मान बढ़ाने की कोशिश करें में एक पैरामीटर है।

यदि आप ऐसा करने में सक्षम नहीं हैं, तो अपने डेटा को कई लेन-देन में अलग करने का प्रयास करें।

इसके अलावा, आप system/core/include/cutils/ashmem.h में ashmem का उपयोग करने के लिए देशी कोड को नियोजित करने जैसे अन्य आईपीसी तंत्र ले सकते हैं। यह मुश्किल नहीं है। जहां तक ​​मुझे पता है, कुछ विक्रेता बाइंडर ड्राइवर समर्थन के बिना कुछ कर्नेल पर बाइंडर लेनदेन को लागू करने के लिए ashmem का उपयोग करते हैं। आप सॉकेट का भी उपयोग कर सकते हैं।

+0

इस मूल्य को बढ़ाने के जोखिम क्या हैं, यदि कोई हैं? – barq

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