के बीच int [] s भेज रहा है मेरे पास एंड्रॉइड में कुछ छवि प्रोसेसिंग जावा कोड है जो दो बड़े int arrays पर कार्य करता है। ज्यादातर समय, जावा पर्याप्त तेज़ है लेकिन मुझे कुछ ऑपरेशन तेज करने के लिए जेएनआई और एनडीके के माध्यम से सी का उपयोग करने की आवश्यकता है।जावा और सी
एकमात्र तरीका मुझे पता है कि मैं int arrays से डेटा को पास कर सकता हूं, एक नया बफर बनाने के लिए ByteBuffer.allocateDirect का उपयोग करना है, उस पर डेटा कॉपी करें और फिर सी कोड को बफर पर कार्य करें।
हालांकि, मैं जावा में इस बफर में डेटा को किसी भी तरह से नहीं जोड़ सकता जैसे कि बफर एक int [] या बाइट [] था। उदाहरण के लिए, बाइटबफर.एरे() को एक कॉल नव निर्मित बफर पर असफल हो जाएगा। क्या यह काम करने का कोई तरीका है?
मेरे पास सीमित स्मृति है और मुझे कितने सरणी/बफर की आवश्यकता है इसे कम करना चाहते हैं। उदाहरण के लिए, यह अच्छा होगा अगर मैं बफर बनाने के लिए IntBuffer.wrap (नया int [...]) का उपयोग कर सकता हूं और फिर जावा में सीधे बफर का समर्थन करने वाले सरणी में हेरफेर कर सकता हूं लेकिन मैं ऐसा नहीं कर सकता क्योंकि केवल एक चीज जो प्रतीत होती है जेएनआई के लिए यहां काम करें ByteBuffer.allocateDirect है।
क्या सी और जावा के बीच डेटा भेजने के लिए कोई और तरीका है? क्या मैं किसी भी तरह से सी पक्ष पर स्मृति आवंटित कर सकता हूं और क्या जावा सीधे डेटा भेज सकता है?
संपादित करें: एक बेंचमार्क की तुलना बफर उपयोग [] उपयोग int करने के लिए:
int size = 1000;
IntBuffer allocateDirect = java.nio.ByteBuffer.allocateDirect(4 * size).asIntBuffer();
for (int i = 0; i < 100; ++i)
{
for (int x = 0; x < size; ++x)
{
int v = allocateDirect.get(x);
allocateDirect.put(x, v + 1);
}
}
int[] intArray = new int[size];
for (int i = 0; i < 100; ++i)
{
for (int x = 0; x < size; ++x)
{
int v = intArray[x];
intArray[x] = v + 1;
}
}
एक Droid फ़ोन पर, बफर संस्करण लेता है ~ 10 सेकंड के समाप्त करने के लिए और सरणी संस्करण ~ 0.01 सेकंड लेता है।
प्रतीक्षा, क्या [ 'ByteBuffer.asIntBuffer'] (http://developer.android.com/reference/java/nio/ByteBuffer.html#asIntBuffer%28%29) के साथ गलत क्या है? क्या आपको वास्तव में 'int [] 'होना चाहिए? – ephemient
... और इसके अलावा, यदि आप चाहें तो इंटबफर पर .array() को कॉल कर सकते हैं। – mpontillo
.array() जावा में सीधे आवंटित सरणी के लिए बाइटबफर और इंटबफर दोनों के लिए एक असमर्थित अपवाद फेंकता है। मैं वास्तव में एक int [] तक पहुंच चाहता हूं ताकि मैं जावा में कम गहन छवि प्रसंस्करण सामग्री कर सकूं। एक छवि को काले और सफेद में परिवर्तित करके जांचें कि कौन से पिक्सल चमक की दहलीज के ऊपर/नीचे हैं। इंटबफर का उपयोग करना प्रत्येक पिक्सेल के लिए मिलता है/डालता है एंड्रॉइड में बहुत धीमा होगा और साथ ही बेकार होगा। – rbcc