在jni调用之间以本机代码分配的内存

时间:2015-10-07 09:35:42

标签: java jvm malloc

我可以在一个JNI函数中分配一个内存块,并在另一个JNI函数中释放一个吗?

我害怕,jvm从本机函数中捕获malloc的调用,并在函数完成时释放它;例如,此代码是否正确:

char * buffer; 
JNIEXPORT jlong JNICALL Java_test_init(JNIEnv *env, jobject obj) {
   buffer = malloc(1000);
   return (jlong)buffer; //for check it
}

JNIEXPORT void JNICALL Java_test_use(JNIEnv *env, jobject obj) {
   // some code, that used buffer
}

JNIEXPORT void JNICALL Java_test_done(JNIEnv *env, jobject obj) {
   free(buffer);
}

UPD:我读到了关于直接缓冲区(NewDirectByteBuffer)和全局引用(NewGlobalRef)的内容,但我问过,我可以在不使用JNI API的情况下分配内存,只需使用call' malloc'

2 个答案:

答案 0 :(得分:1)

是的,这是一种有效的方法。

JVM无法控制本机代码的作用;如果它试图拦截malloc / free调用,它可能会破坏许多第三方库。此外,JDK代码本身也使用类似的方法。示例:123

答案 1 :(得分:0)

如果您有对象的全局引用,则在从JNI函数返回后它仍然有效。这意味着您的示例是正确的。 有关详细信息,请查看此处:local and global references