2012-02-20 14 views
10

वस्तुओं मैं निम्नलिखित JNI विधि है कि बनाता है जावा का एक संग्रह देशी रूप वस्तुओं, और फिर उन्हें जावा पर लौटने:JNI निर्माण और स्मृति प्रबंधन

JNIEXPORT jobject JNICALL Java_com_test_myClass_myMethod(JNIEnv * env, jclass klass) { 
    jclass arrayClass = env->FindClass("java/util/ArrayList"); 
    jmethodID initMethod = env->GetMethodID(arrayClass, "<init>", "()V"); 
    jmethodID addMethod = env->GetMethodID(arrayClass, "add", "(Ljava/lang/Object;)Z"); 
    jobject myArray = env->NewObject(arrayClass, initMethod); 

    env->CallBooleanMethod(myArray, addMethod, env->NewStringUTF("Hello")); 
    env->CallBooleanMethod(myArray, addMethod, env->NewStringUTF("World")); 

    return myArray; 
} 

मैं मूल कोड में बनाया वस्तुओं मुक्त करने की आवश्यकता है , या यह जीसी द्वारा स्वचालित रूप से किया जाता है? यदि मैं करता हूं, तो मैं इसे कैसे कर सकता हूं, क्योंकि मुझे इसे जावा पर वापस करने की आवश्यकता है?

+0

मुझे लगता है कि यह अपने स्वयं के मेमोरी प्रबंधन करने के लिए मूल कोड पर होगा। इस मामले में मैं कल्पना करता हूं कि आपको एक और मूल विधि जोड़ने की आवश्यकता होगी जो आवंटित ऑब्जेक्ट्स को रिलीज़ करे, जिसे आप मैन्युअल रूप से कॉल करते समय मैन्युअल रूप से कॉल करते हैं। अधिक आम तौर पर, यदि आप जेएनआई के साथ चीजें कर रहे हैं तो मुझे उम्मीद है कि आप चोट की दुनिया के लिए तैयार हैं। यह उत्तर मदद कर सकता है: http://stackoverflow.com/questions/214699/jni-memory-management-using-the-invocation-api – aroth

+3

@aroth - गलत। यदि आप जेएनआई में जावा ऑब्जेक्ट आवंटित करते हैं, तो वे जीसी के स्वामित्व वाली जावा ऑब्जेक्ट्स हैं। – bmargulies

+0

@bmargulies - समझ में आता है, लेकिन मूल कोड के मामले में जो गैर-जावा ऑब्जेक्ट्स/मेमोरी आवंटित करता है, उदाहरण के लिए 'malloc() 'को कॉल करके? – aroth

उत्तर

11

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

कभी-कभी यह देशी ऑब्जेक्ट्स में संदर्भ जावा ऑब्जेक्ट्स के लिए उपयोगी है। यह मूल कोड धारण करते समय स्मृति आवश्यकताओं को कम कर सकता है, लेकिन अब बड़ी वस्तुओं या संदर्भों की एक बड़ी संख्या के संदर्भों की आवश्यकता नहीं है।

से: JNI specification में "वैश्विक और स्थानीय संदर्भ" से।

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

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

अतिरिक्त विस्तार प्रदान की गई थी JNI प्रोग्रामर की मार्गदर्शिका में "Freeing References" देखें।

+0

मैंने फ्रीिंग संदर्भों के बारे में मार्गदर्शिका पढ़ी है, लेकिन इसके बारे में कोई सवाल है: विधि को मेरी प्रारंभिक पोस्ट में कॉल करने से बड़ी संख्या में संसाधन थकावट समस्या पैदा हो सकती है? यदि हां, तो मैं संदर्भ कहां मुक्त कर सकता हूं, क्योंकि मुझे अभी भी उन्हें वापस करने की आवश्यकता है? – nbarraille

+0

प्रत्येक कॉल के बाद स्थानीय संदर्भ स्वचालित रूप से मुक्त हो जाते हैं। आपको इसे स्पष्ट रूप से करने की ज़रूरत नहीं है, जब तक कि 1) आपने वैश्विक संदर्भ नहीं बनाया है, या 2) लिंक में वर्णित किसी कारण के लिए, कॉल पूर्ण होने से पहले स्थानीय संदर्भों को मुक्त करने की आवश्यकता है। जिस संदर्भ में आप लौट रहे हैं उसकी प्रतिलिपि बनाई जा रही है।MyArray और लौटा संदर्भ दोनों एक ही जावा ऑब्जेक्ट पर इंगित करते हैं। –

+0

लिंक मृत ... – BeniBela

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