在 jni 调用之间在本机代码中分配的内存
memory allocated in native code between jni calls
我可以在一个 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'
如果您的对象有一个全局引用,那么它在您的 JNI 函数返回后仍然有效。这意味着您的示例是正确的。
如需更多信息,请查看此处:local and global references
是的,这是一个有效的方法。
JVM 无法控制本机代码的作用;如果它试图拦截 malloc/free 调用,它可能会破坏许多第三方库。此外,JDK 代码本身也使用了类似的方法。示例:1, 2, 3.
我可以在一个 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'
如果您的对象有一个全局引用,那么它在您的 JNI 函数返回后仍然有效。这意味着您的示例是正确的。 如需更多信息,请查看此处:local and global references
是的,这是一个有效的方法。
JVM 无法控制本机代码的作用;如果它试图拦截 malloc/free 调用,它可能会破坏许多第三方库。此外,JDK 代码本身也使用了类似的方法。示例:1, 2, 3.