使用過(guò)JNI的童鞋們都知道這個(gè)玩意并不是那么簡(jiǎn)單而友好,許多個(gè)地方需要注意,并在實(shí)踐中吃了虧才明白個(gè)中道理。這兩天一直糾結(jié)于跟JNI相關(guān)的東西,現(xiàn)在總結(jié)如下:
1. 對(duì)于調(diào)用頻繁的類、方法ID、字段ID可以緩存起來(lái),但是要注意是在同一個(gè)線程中。
2. 定義Java代碼和本地代碼的界限,最大限度的減少兩者之間的互相調(diào)用。
3. 本地代碼中創(chuàng)建的引用(局部引用和全局引用)如果已經(jīng)不需要了,就顯式的刪除掉吧,不要等虛擬機(jī)為你去作這個(gè)事情了,雖然它會(huì)做,但是不能確定虛擬機(jī)什么時(shí)候會(huì)去做。
4. 在可能會(huì)導(dǎo)致異常的調(diào)用后,始終檢查異常情況,多一句ExceptionCheck,少一堆宕機(jī)的、莫名的煩惱。
5. 如果本地代碼需要?jiǎng)?chuàng)建大量引用,用EnsureLocalCapacity告訴虛擬機(jī),讓虛擬機(jī)對(duì)本地引用作相應(yīng)的優(yōu)化。