वस्तुओं मैं निम्नलिखित 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;
}
मैं मूल कोड में बनाया वस्तुओं मुक्त करने की आवश्यकता है , या यह जीसी द्वारा स्वचालित रूप से किया जाता है? यदि मैं करता हूं, तो मैं इसे कैसे कर सकता हूं, क्योंकि मुझे इसे जावा पर वापस करने की आवश्यकता है?
मुझे लगता है कि यह अपने स्वयं के मेमोरी प्रबंधन करने के लिए मूल कोड पर होगा। इस मामले में मैं कल्पना करता हूं कि आपको एक और मूल विधि जोड़ने की आवश्यकता होगी जो आवंटित ऑब्जेक्ट्स को रिलीज़ करे, जिसे आप मैन्युअल रूप से कॉल करते समय मैन्युअल रूप से कॉल करते हैं। अधिक आम तौर पर, यदि आप जेएनआई के साथ चीजें कर रहे हैं तो मुझे उम्मीद है कि आप चोट की दुनिया के लिए तैयार हैं। यह उत्तर मदद कर सकता है: http://stackoverflow.com/questions/214699/jni-memory-management-using-the-invocation-api – aroth
@aroth - गलत। यदि आप जेएनआई में जावा ऑब्जेक्ट आवंटित करते हैं, तो वे जीसी के स्वामित्व वाली जावा ऑब्जेक्ट्स हैं। – bmargulies
@bmargulies - समझ में आता है, लेकिन मूल कोड के मामले में जो गैर-जावा ऑब्जेक्ट्स/मेमोरी आवंटित करता है, उदाहरण के लिए 'malloc() 'को कॉल करके? – aroth