日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 程序喵大人
[導讀]最近開發(fā)過程中遇到了JNI的Reference相關(guān)問題,了解到Local Reference和Global Reference的相關(guān)知識點,整理如下: 背景:項目需求,在Native C/C++層調(diào)用上層Android Camera Java接口,把所有的操作包括Camera都沉到Native層去實現(xiàn)。但在JNI調(diào)試過程中遇到了


最近開發(fā)過程中遇到了JNI的Reference相關(guān)問題,了解到Local Reference和Global Reference的相關(guān)知識點,整理如下:

背景:項目需求,在Native C/C++層調(diào)用上層Android Camera Java接口,把所有的操作包括Camera都沉到Native層去實現(xiàn)。但在JNI調(diào)試過程中遇到了android JNI ERROR (app bug): accessed stale local reference的報錯。

現(xiàn)象:在Native層創(chuàng)建Java的Camera對象,其對象的指針保存到本地,函數(shù)返回到Java層,之后再進入Native層,想通過Native層的Camera對象指針調(diào)用相應(yīng)的方法,但是發(fā)現(xiàn)每次都是重新調(diào)用Java對象方法后報錯。

分析:在Native層創(chuàng)建的Java對象,對象創(chuàng)建后會有一個局部引用指向該對象,當從Native環(huán)境返回到Java環(huán)境,該局部引用失效,此對象就沒有引用計數(shù),Java的內(nèi)存回收機制會自動回收該對象,第二次再進入Native層訪問其之前保存的地址時就會報錯。

解決:使用全局引用始終持有該對象的引用使其不被自動回收,請看下面的知識點。

Local Reference

局部引用,看如下精簡代碼:

env->NewStringUTF("0");

在JNI中,每次調(diào)用NewObject方法創(chuàng)建一個新的對象都會返回一個對該對象的局部引用(Local Reference),該局部引用只在線程當前的Native環(huán)境中有效,返回到Java環(huán)境后該引用與對象之間的聯(lián)系就會被斷掉,引用失效,所以我們不能在Native方法中把局部引用緩存用于下一次調(diào)用時使用。

局部引用可以無限創(chuàng)建嗎?

如圖:


這里引入局部引用表的概念,每當線程從Java環(huán)境進入到Native環(huán)境后,JVM就會創(chuàng)建該線程Native環(huán)境的局部引用表,用來保存本次Native環(huán)境所創(chuàng)建的所有局部引用,每當Native中引用或者新創(chuàng)建一個Java對象,JVM就會局部引用表創(chuàng)建一個局部引用,局部引用表是有大小限制的,最大是512,如果超過限制會報OOM內(nèi)存泄漏。

Q:那如何才能更好的避免由于局部引用過多造成Native環(huán)境中的OOM呢?

A:控制局部引用的生命周期,如果需要創(chuàng)建過多的局部引用,可以在Java對象的操作結(jié)束后,手動調(diào)用DeleteLocalRef函數(shù)刪除局部引用,該局部引用就會在局部引用表中被移除,避免觸發(fā)局部引用表的大小限制。

注意:局部引用不是我們平時所理解的代碼中的局部變量,局部變量在當前生命周期(例如函數(shù)退出)結(jié)束后就會失效,而局部引用在函數(shù)退出后可能不會失效,它的生命周期是和整個Native上下文環(huán)境相關(guān)聯(lián),只有從Native環(huán)境返回到Java環(huán)境后局部引用才會失效。

Global Reference

全局引用,終于到了最上面討論的問題了,因為局部引用在Native環(huán)境返回到Java環(huán)境后就會失效,導致下次進入Native環(huán)境后再次使用相對應(yīng)的Java對象就會出錯,所以可以使用全局引用來解決這個問題,全局引用可以始終與Java對象保持聯(lián)系,使得此對象不會被JVM回收掉,見如下代碼:

JNIEXPORT jint JNICALL JNI_OnLoad (JavaVM * vm, void * reserved) {  jclass tmp = env->FindClass("com/example/company/MyClass");  jclass class = env->NewGlobalRef(tmp); return JNI_VERSION_1_6; }

這里需要注意,在不需要使用Java對象后盡量手動調(diào)用DeleteGlobalRef()函數(shù)來使得引用失效,避免對象始終存在,產(chǎn)生潛在的內(nèi)存泄漏。

Weak Global Reference

虛全局引用與全局引用的區(qū)別在于該類型的引用可能隨時被JVM回收掉,這里涉及到幾個函數(shù):

NewWeakGlobalRef();DeleteWeakGlobalRef();isSameObject();

在使用虛引用前需要通過isSameObject將其和NULL比較,如果返回true表示已經(jīng)被JVM回收掉就不能使用了,這里有可能前一行代碼判斷還是可用,后一行代碼時就被JVM回收,解決辦法是通過NewLocalRef()獲取虛全局引用,避免當時被JVM回收。

參考資料

https://www.cnblogs.com/zhongshujunqia/p/4638077.html?utm_source=tuicool&utm_medium=referral
https://www.cnblogs.com/younghome/p/4609044.html
https://stackoverflow.com/questions/14765776/jni-error-app-bug-accessed-stale-local-reference-0xbc00021-index-8-in-a-tabl
https://www.ibm.com/developerworks/cn/java/j-lo-jnileak/index.html
https://juejin.im/post/5c19bfa0f265da6133568545



c++11新特性,所有知識點都在這了!

你的c++團隊還在禁用異常處理嗎?

內(nèi)存對齊之格式修訂版

c++11新特性之智能指針

gcc a.c 究竟經(jīng)歷了什么?

談?wù)劤绦蜴溄蛹胺侄文切┦?/span>

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉