我有一個創建一個Java集合原生對象,然後將它們返回到Java以下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;
}
我需要釋放在本地代碼創建的對象,還是由GC自動完成? 如果我這樣做,我該如何做,因爲我需要將它返回給Java?
我認爲這將取決於本機代碼做自己的內存管理。在這種情況下,我會想象你需要添加另一個本地方法來釋放分配的對象,當你完成它們時你手動調用它。更一般地說,如果你正在用JNI做事情,那麼我希望你已經準備好了一個受到傷害的世界。此答案可能有所幫助:http://stackoverflow.com/questions/214699/jni-memory-management-using-the-invocation-api – aroth 2012-02-20 23:34:24
@aroth - 錯誤。如果您在JNI中分配Java對象,則它們是由GC擁有的Java對象。 – bmargulies 2012-02-20 23:38:32
@bmargulies - 有道理,但在通過調用'malloc()'來分配非Java對象/內存的本地代碼的情況下呢? – aroth 2012-02-20 23:50:18