欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

原生方式訪問資源的方法、Java端、原生端及系統(tǒng)與流程

文檔序號(hào):12038894閱讀:193來源:國知局
原生方式訪問資源的方法、Java端、原生端及系統(tǒng)與流程
本發(fā)明涉及通訊領(lǐng)域,具體而言,涉及原生方式訪問資源的方法、Java端、原生端及系統(tǒng)。

背景技術(shù):
現(xiàn)有的Android系統(tǒng),主要通過兩種方式來訪問Android資源,方式一為通過Java端打開資源流,傳遞給原生端,原生端通過JNI方式讀取資源內(nèi)容;方式二Java端只傳遞APK路徑給原生端,原生端通過libzip直接讀取資源內(nèi)容。這兩種方式均導(dǎo)致Android性能較差,在Java端打開,原生端調(diào)用JNI都需要耗費(fèi)額外的內(nèi)存和時(shí)間,而且,需要包含額外的libzip庫,代碼更加復(fù)雜,且需要了解APK文件路徑,增加了代碼維護(hù)難度,性能上存在問題,因?yàn)樾枰馕鯝PK,如果APK較大,速度會(huì)相應(yīng)變慢。

技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供原生方式訪問資源的方法、Java端、原生端及系統(tǒng),以解決上述的問題。在本發(fā)明的實(shí)施例中提供了一種原生方式訪問資源的方法,包括:Java端獲取上下文對(duì)象;所述Java端將所述上下文對(duì)象通過JNI傳遞到原生端;所述原生端獲得所述上下文對(duì)象后將所述上下文對(duì)象進(jìn)行保存;所述原生端通過保存的所述上下文對(duì)象,調(diào)用getResource方法獲得資源管理器;所述原生端通過資源管理器的方法打開待讀取資源;所述原生端獲得輸入流,通過所述輸入流讀取所述待讀取資源的數(shù)據(jù)。所述待讀取資源的描述方式優(yōu)選包括以下任一種:路徑方式、資源標(biāo)識(shí)ID方式。所述原生端通過資源管理器的方法打開待讀取資源優(yōu)選包括:所述原生端通過Android的資源類ResTable的getResource方法獲得所述待讀取資源的區(qū)塊、所述數(shù)據(jù);所述原生端通過所述區(qū)塊,使用ResTable的resolveReference方法獲得所述待讀取資源的真正區(qū)塊位置;若所述真正區(qū)塊位置有效,通過ResTable的getTableCookie方法獲得所述待讀取資源的句柄;所述原生端通過ResTable的getTableStringBlock方法,以所述區(qū)塊為參數(shù),獲得所述待讀取資源的真實(shí)路徑。所述原生端獲得輸入流優(yōu)選包括:所述原生端根據(jù)所述真實(shí)路徑和所述句柄,通過Assert的openNonAsset方法打開所述待讀取資源的輸入流。所述原生端通過Android的資源類ResTable的getResource方法獲得所述待讀取資源的區(qū)塊、所述數(shù)據(jù)之前,所述原生端通過資源管理器的方法打開待讀取資源優(yōu)選還包括:通過編譯對(duì)應(yīng)不同版本的Android的getResource來完成對(duì)不同版本Android的適配。本發(fā)明的一個(gè)實(shí)施例還提供一種根據(jù)上述任一項(xiàng)所述的原生方式訪問資源的方法的Java端,包括第一獲取組件、傳遞組件;所述第一獲取組件,用于獲取上下文對(duì)象;所述傳遞組件,用于將所述上下文對(duì)象通過JNI傳遞到原生端。本發(fā)明的一個(gè)實(shí)施例中還提供了一種上述任一項(xiàng)所述的原生方式訪問資源的方法的原生端,包括:第二獲取組件、調(diào)用組件、打開組件、讀取組件;所述第二獲取組件,用于獲得所述上下文對(duì)象后將所述上下文對(duì)象進(jìn)行保存;所述調(diào)用組件,用于通過所述上下文對(duì)象,調(diào)用getResource方法獲得資源管理器;所述打開組件,用于通過資源管理器的方法打開待讀取資源;所述讀取組件,用于獲得輸入流,通過所述輸入流讀取所述待讀取資源的數(shù)據(jù)。所述打開組件優(yōu)選包括:第三獲取組件、第四獲取組件、第五獲取組件、第六獲取組件;所述第三獲取組件,用于通過Android的資源類ResTable的getResource方法獲得所述待讀取資源的區(qū)塊、所述數(shù)據(jù);所述第四獲取組件,用于通過所述區(qū)塊,使用ResTable的resolveReference方法獲得所述待讀取資源的真正區(qū)塊位置;所述第五獲取組件,用于若所述真正區(qū)塊位置有效,通過ResTable的getTableCookie方法獲得所述待讀取資源的句柄;所述第六獲取組件,用于通過ResTable的getTableStringBlock方法,以所述區(qū)塊為參數(shù),獲得所述待讀取資源的真實(shí)路徑。所述讀取組件,優(yōu)選用于根據(jù)所述真實(shí)路徑和所述句柄,通過Assert的openNonAsset方法打開所述待讀取資源的輸入流。本發(fā)明一個(gè)實(shí)施例中還提供了一種所述的方法的原生方式訪問資源的系統(tǒng),包括:上述的Java端、上述任一項(xiàng)所述的原生端。本發(fā)明上述實(shí)施例的原生方式訪問資源的方法、Java端、原生端及系統(tǒng),從原生端訪問Android資源,只需Java傳入上下文對(duì)象,不依賴于APK具體位置,從原生端讀取資源,保證讀取的效率和靈活性,減少Java端的依賴性,提高代碼模塊化程度,通過原生端訪問資源讀取資源的方式簡單,直接,沒有額外的開銷,節(jié)省了內(nèi)存和時(shí)間,性能高。附圖說明圖1示出了一個(gè)實(shí)施例中原生方式訪問資源的方法的流程示意圖;圖2示出了圖1步驟105的動(dòng)態(tài)載入方式流程示意圖;圖3示出了一個(gè)實(shí)施例中對(duì)應(yīng)動(dòng)態(tài)載入方式打開和讀取資源的架構(gòu)。具體實(shí)施方式下面通過具體的實(shí)施例子并結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步的詳細(xì)描述。本發(fā)明的一個(gè)實(shí)施例提供了一種原生方式訪問資源的方法,包括:Java端獲取上下文對(duì)象;所述Java端將所述上下文對(duì)象通過JNI傳遞到原生端;所述原生端獲得所述上下文對(duì)象后將所述上下文對(duì)象進(jìn)行保存;所述原生端通過保存的所述上下文對(duì)象,調(diào)用getResource方法獲得資源管理器;所述原生端通過資源管理器的方法打開待讀取資源;所述原生端獲得輸入流,通過所述輸入流讀取所述待讀取資源的數(shù)據(jù)。本發(fā)明的一個(gè)實(shí)施例還提供了一種對(duì)應(yīng)上述方法的Java端,包括第一獲取組件、傳遞組件;所述第一獲取組件,用于獲取上下文對(duì)象;所述傳遞組件,用于將所述上下文對(duì)象通過JNI傳遞到原生端。本發(fā)明的一個(gè)實(shí)施例還提供了一種對(duì)應(yīng)上述方法的原生端,包括:第二獲取組件、調(diào)用組件、打開組件、讀取組件;所述第二獲取組件,用于獲得所述上下文對(duì)象后將所述上下文對(duì)象進(jìn)行保存;所述調(diào)用組件,用于通過所述上下文對(duì)象,調(diào)用getResource方法獲得資源管理器;所述打開組件,用于通過資源管理器的方法打開待讀取資源;所述讀取組件,用于獲得輸入流,通過所述輸入流讀取所述待讀取資源的數(shù)據(jù)。本發(fā)明一個(gè)實(shí)施例中還提供了一種對(duì)應(yīng)上述的方法的原生方式訪問資源的系統(tǒng),包括:上述的Java端、上述任一項(xiàng)所述的原生端。本發(fā)明上述實(shí)施例的原生方式訪問資源的方法、Java端、原生端及系統(tǒng),從原生端訪問Android資源,只需Java傳入上下文對(duì)象,不依賴于APK具體位置,從原生端讀取資源,保證讀取的效率和靈活性。接下來,本發(fā)明將通過一些具體的實(shí)施方式來詳細(xì)描述原生方式訪問資源的方法:上述方法是對(duì)應(yīng)在Android上通過原生方式訪問資源的方法,發(fā)明點(diǎn)之一:只需要Java端傳入上下文對(duì)象,不依賴與APK具體位置,減小Java端的依賴,提高代碼模塊化程度。發(fā)明點(diǎn)之二:通過調(diào)用Android私有的API實(shí)現(xiàn)從原生端讀取資源,保證讀取的效率和靈活性。發(fā)明點(diǎn)之三:在不影響上層應(yīng)用的情況下,動(dòng)態(tài)載入Android適配庫,上層通過接口層隔離具體實(shí)現(xiàn),保證了方案的通用性。上述多個(gè)發(fā)明點(diǎn)的詳細(xì)操作步驟為,如圖1所示:步驟101,Java端獲取上下文對(duì)象;步驟102,Java端將該上下文對(duì)象通過JNI傳遞到原生端;JNI是JavaNativeInterface的縮寫,中文為JAVA本地調(diào)用。從Java1.1開始,JavaNativeInterface(JNI)標(biāo)準(zhǔn)成為java平臺(tái)的一部分,它允許Java代碼和其他語言寫的代碼進(jìn)行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設(shè)計(jì)的,但是它并不妨礙使用其他語言,只要調(diào)用約定受支持就可以了。Java端只需要獲取上下文對(duì)象并將上下文對(duì)象傳遞給原生端,從而減少了對(duì)Java端的依賴性,代碼模塊化程度高。步驟103,原生端獲得該上下文對(duì)象后將該上下文對(duì)象進(jìn)行保存;保存后備后調(diào)用。步驟104,原生端通過保存的上下文對(duì)象,調(diào)用getResource方法獲得資源管理器;getResource方法是本領(lǐng)域技術(shù)人員所公知的一個(gè)功能方法。步驟105,原生端通過資源管理器的方法打開待讀取資源;打開和讀取資源信息用到了Android的一些私有接口,為了保證兼容性,本步驟采用了動(dòng)態(tài)載入方式,流程圖如圖2所示:步驟105-1,通過編譯對(duì)應(yīng)不同版本的Android的getResource來完成對(duì)不同版本Android的適配;上層應(yīng)用調(diào)用的是接口層,底層改動(dòng)不影響上層,而具體的實(shí)現(xiàn)則針對(duì)Android版本不同略有差別,這個(gè)差別很小,通過上述動(dòng)態(tài)載入Android適配庫,上層通過接口層隔離具體實(shí)現(xiàn),保證了方案的通用性。不同的Android版本對(duì)應(yīng)不同的getResource,各getResource不同也僅是在參數(shù)上的不同。步驟105-2,所述原生端通過Android的資源類ResTable的getResource方法獲得所述待讀取資源的區(qū)塊、所述數(shù)據(jù);步驟105-3,所述原生端通過所述區(qū)塊,使用ResTable的resolveReference方法獲得所述待讀取資源的真正區(qū)塊位置;步驟105-4,若所述真正區(qū)塊位置有效,通過ResTable的getTableCookie方法獲得所述待讀取資源的句柄;步驟105-5,所述原生端通過ResTable的getTableStringBlock方法,以所述區(qū)塊為參數(shù),獲得所述待讀取資源的真實(shí)路徑。對(duì)應(yīng)動(dòng)態(tài)載入方式的打開和讀取資源信息的架構(gòu)如圖3,所示,上層應(yīng)用調(diào)用的是接口層,因?yàn)榈讓痈膭?dòng)不影響上層,而具體的實(shí)現(xiàn)則針對(duì)Android版本不同略有差別。上述實(shí)現(xiàn)過程簡單精悍,雖然需要針對(duì)不同平臺(tái)進(jìn)行適配,但是,這只在第一步進(jìn)行不同操作,而適配過程中,對(duì)應(yīng)不同版本的Android不同版本的getResource方法參數(shù)不同,進(jìn)行對(duì)應(yīng)性編譯控制,針對(duì)不同平臺(tái)編譯不同的庫即可。步驟106,原生端根據(jù)所述真實(shí)路徑和所述句柄,通過Assert的openNonAsset方法打開所述待讀取資源的輸入流。步驟107,原生端通過該輸入流讀取待讀取資源的數(shù)據(jù)。分析上述整個(gè)方案,與傳統(tǒng)方式相比:1.Java端只需要傳遞給原生端上下文對(duì)象,對(duì)Java端依賴性小,代碼模塊化程度高;2.打開和讀取資源簡單直接,沒有額外的開銷,節(jié)省了內(nèi)存和事件,性能極高;3.直接調(diào)用Android接口訪問資源,因此,可獲得資源的詳細(xì)信息,其他方案都無法得到。需要說明的是,上述提到的各種方法(getResource方法、ResTable的getResource方法、ResTable的resolveReference方法、ResTable的getTableCookie方法、ResTable的getTableStringBlock方法),以及API、以及Android均為本領(lǐng)域技術(shù)人員所了解,此處不再贅述。本發(fā)明的一些實(shí)施例中還提供了對(duì)應(yīng)上述通過原生方式訪問資源的方法的Java端,包括第一獲取組件、傳遞組件;所述第一獲取組件,用于獲取上下文對(duì)象;所述傳遞組件,用于將所述上下文對(duì)象通過JNI傳遞到原生端。本發(fā)明的一個(gè)實(shí)施例中還提供了一種上述任一項(xiàng)所述的原生方式訪問資源的方法的原生端,包括:第二獲取組件、調(diào)用組件、打開組件、讀取組件;所述第二獲取組件,用于獲得所述上下文對(duì)象后將所述上下文對(duì)象進(jìn)行保存;所述調(diào)用組件,用于通過所述上下文對(duì)象,調(diào)用getResource方法獲得資源管理器;所述打開組件,用于通過資源管理器的方法打開待讀取資源;所述讀取組件,用于獲得輸入流,通過所述輸入流讀取所述待讀取資源的數(shù)據(jù)。所述打開組件優(yōu)選包括:第三獲取組件、第四獲取組件、第五獲取組件、第六獲取組件;所述第三獲取組件,用于通過Android的資源類ResTable的getResource方法獲得所述待讀取資源的區(qū)塊、所述數(shù)據(jù);所述第四獲取組件,用于通過所述區(qū)塊,使用ResTable的resolveReference方法獲得所述待讀取資源的真正區(qū)塊位置;所述第五獲取組件,用于若所述真正區(qū)塊位置有效,通過ResTable的getTableCookie方法獲得所述待讀取資源的句柄;所述第六獲取組件,用于通過ResTable的getTableStringBlock方法,以所述區(qū)塊為參數(shù),獲得所述待讀取資源的真實(shí)路徑。所述讀取組件,優(yōu)選用于根據(jù)所述真實(shí)路徑和所述句柄,通過Assert的openNonAsset方法打開所述待讀取資源的輸入流。本發(fā)明一個(gè)實(shí)施例中還提供了一種所述的方法的原生方式訪問資源的系統(tǒng),包括:上述的Java端、上述任一項(xiàng)所述的原生端。本發(fā)明上述實(shí)施例的原生方式訪問資源的方法、Java端、原生端及系統(tǒng),從原生端訪問Android資源,只需Java傳入上下文對(duì)象,不依賴于APK具體位置,從原生端讀取資源,保證讀取的效率和靈活性,減少Java端的依賴性,提高代碼模塊化程度,通過原生端訪問資源讀取資源的方式簡單,直接,沒有額外的開銷,節(jié)省了內(nèi)存和時(shí)間,性能高。顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計(jì)算裝置來實(shí)現(xiàn),它們可以集中在單個(gè)的計(jì)算裝置上,或者分布在多個(gè)計(jì)算裝置所組成的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來實(shí)現(xiàn),從而,可以將它們存儲(chǔ)在存儲(chǔ)裝置中由計(jì)算裝置來執(zhí)行,或者將它們分別制作成各個(gè)集成電路模塊,或者將它們中的多個(gè)模塊或步驟制作成單個(gè)集成電路模塊來實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
上蔡县| 石楼县| 泊头市| 平邑县| 阿拉善盟| 博爱县| 滕州市| 新竹市| 大安市| 静安区| 廊坊市| 琼海市| 泗洪县| 丰台区| 广西| 合川市| 汪清县| 麻江县| 乌海市| 四子王旗| 英德市| 万安县| 长寿区| 洪洞县| 惠安县| 卓资县| 凌海市| 永清县| 汪清县| 织金县| 从江县| 文成县| 金秀| 塔河县| 东乡族自治县| 石柱| 吕梁市| 边坝县| 吉首市| 诸城市| 富锦市|