2011-04-14 61 views
3

在jni中我們有GetPrimitiveArrayElements函數來獲取指向堆上的數組元素的指針和ReleasePrimitiveArrayElements以刪除數組的本地副本。jni-釋放對象數組

但是我正在將java對象的數組傳遞給JNI。這些數組元素使用GetObjectArrayElement函數迭代到本地jobject。

但是,如何在處理數組元素後刪除jobject的本地引用。

感謝

回答

1

不管是否jobject是你被抓最初在Java端或通過您的JNI方法,they will be handled by garbage collection只要有對的對象沒有揮之不去的引用分配。因此,如果您本地對jobject的引用僅僅是局部變量,它們將在函數的末尾消失,並且您的對象將有資格在正常事件中導致垃圾回收。如果您保留對象的GlobalRef,那麼該對象將仍然存在,並且本地引用將會像任何未分配堆空間的局部變量一樣消失。如果您保留WeakRef,則該對象可能會被垃圾回收,但如果不是,它仍然對另一個JNI調用有效。通過JNI調用保留對jobject的普通本地引用無效。

另外,如果你想發佈您的本地參考馬上而不是等待(例如,如果你在一個函數創建噸jobject引用,只是使用的JNIEnv的DeleteLocalRef(env, jobj);方法。

在任何情況下,the documentation應該告訴你一切,你需要知道有沒有犯任何錯誤

+2

鏈接將不起作用。 – user210504 2012-10-02 18:49:54

+0

@ Nitrex88對不起。我的downvote是一個錯誤。我錯了。我無法取消它,因爲你的anwser太舊了。編輯它,我會upvote。 – manuell 2013-11-29 20:29:16

+0

@manuell編輯過,但很難理解爲什麼你會在你自己的答案中提出的答案是「錯誤的」。並不是不正確。 – EJP 2017-06-24 03:01:58

0

你可以什麼也不做,或致電DeleteLocalRef()

JNI Specification Chapter 2:。

全局和局部引用

的JNI劃分使用本地代碼分爲兩大類對象引用:局部和全局引用。本地引用在本機方法調用期間有效,並在本機方法返回後自動釋放。全局引用在顯式釋放前保持有效。

對象作爲本地引用傳遞給本地方法。所有由JNI函數返回的Java對象都是本地引用。 JNI允許程序員從本地引用創建全局引用。希望Java對象接受全局和本地引用的JNI函數。作爲結果,本地方法可能會將本地或全局引用返回給VM。

在大多數情況下,程序員應該依靠VM在本地方法返回後釋放所有本地引用。但是,有時程序員應該明確地釋放本地引用。例如,考慮以下情況:

本地方法訪問大型Java對象,從而創建對Java對象的本地引用。本地方法然後在返回給調用者之前執行額外的計算。對大型Java對象的本地引用將防止對象被垃圾收集,即使該對象不再用於其餘計算。 本地方法會創建大量本地引用,儘管並非所有引用都在同一時間使用。由於VM需要一定的空間來跟蹤本地引用,因此創建過多的本地引用可能會導致系統內存不足。例如,本地方法遍歷大量對象,檢索元素作爲本地引用,並在每次迭代時對一個元素進行操作。每次迭代後,程序員不再需要本地引用數組元素。

JNI允許程序員手動刪除本地方法中任意點的本地引用。爲了確保程序員可以手動釋放本地引用,JNI函數不允許創建額外的本地引用,除了它們作爲結果返回的引用。

本地引用僅在創建它們的線程中有效。本機代碼不得將本地引用從一個線程傳遞到另一個線程。