2015-10-07 27 views
1

我可以在一個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)和全球refererences(NewGlobalRef),但我問,我可以分配內存不使用JNI API,只需用電話「的malloc」

回答

1

是的,這是一個有效的方法。

JVM無法控制本機代碼的功能;如果它試圖攔截malloc /免費通話,它可能會破壞很多第三方庫。此外,JDK代碼本身也使用類似的方法。示例:12,3

0

如果您有對象的全局引用,那麼它在從JNI函數返回後保持有效。這意味着你的例子是正確的。 欲瞭解更多信息,請看這裏:local and global references

+0

不,這意味着我的示例不正確,因爲我沒有創建全局引用。事實上,我之所以問,是因爲閱讀了本地和全球的參考資料 –

相關問題