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



我可以在一个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的情况下分配内存,只需调用'malloc'

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

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

如果您的对象有一个全局引用,那么它在从JNI函数返回后仍然有效。也就是说你的例子是正确的。有关更多信息,请参阅此处:本地和全局引用

相关内容

  • 没有找到相关文章

最新更新