Android系統(tǒng)中native層調(diào)用Java層API的方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計算機應(yīng)用技術(shù)領(lǐng)域,具體涉及一種Android系統(tǒng)中native層調(diào)用 Java層API的方法和裝置。
【背景技術(shù)】
[0002] Android操作系統(tǒng)是一種以Linux為基礎(chǔ)的操作系統(tǒng),主要使用于便攜設(shè)備。 Android系統(tǒng)中上層應(yīng)用的開發(fā)一般基于Java完成。
[0003] Java是平臺無關(guān)的,因此有些底層的任務(wù)用Java實現(xiàn)起來并不容易,例如,當(dāng)涉 及本地服務(wù)、鏈接庫或硬件驅(qū)動等方面的任務(wù)時,通常需要運行C來實現(xiàn),而C程序運行在 native (本地方法)層。Java層和 native 層之間可通過一種 JNI (Java Native Interface ; Java,native接口)的機制相互調(diào)用。Android系統(tǒng)中,更多的功能是以Java層API的形 式提供的,native層也經(jīng)常需要調(diào)用這些Java層的API以實現(xiàn)相應(yīng)的功能。
[0004] 然而現(xiàn)有技術(shù)中的native層調(diào)用Java層API的方式中,往往需要Java層和 native層之間通過JNI多次重復(fù)地相互調(diào)用,效率低下,并且容易因此引起內(nèi)存泄露或程 序崩潰等問題。
【發(fā)明內(nèi)容】
[0005] 鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上 述問題的Android系統(tǒng)中native層調(diào)用Java層API的方法和裝置。
[0006] 根據(jù)本發(fā)明的一個方面,提供了一種Android系統(tǒng)中native層調(diào)用Java層API 的方法,應(yīng)用于Android系統(tǒng)的native層中,方法包括:
[0007] 根據(jù)native線程與Java層API之間的調(diào)用關(guān)系,將native線程與Java層API 對應(yīng)的JNI環(huán)境變量綁定;
[0008] 根據(jù)Java層API的調(diào)用請求,獲取與native線程綁定的JNI環(huán)境變量;
[0009] 根據(jù)JNI環(huán)境變量調(diào)用Java層API。
[0010] 根據(jù)本發(fā)明的另一方面,提供了一種Android系統(tǒng)中native層調(diào)用Java層API 的裝置,應(yīng)用于Android系統(tǒng)的native層中,裝置包括:
[0011] 綁定模塊,適于根據(jù)native線程與Java層API之間的調(diào)用關(guān)系,將native線程 與Java層API對應(yīng)的JNI環(huán)境變量綁定;
[0012] 獲取模塊,適于根據(jù)Java層API的調(diào)用請求,獲取與native線程綁定的JNI環(huán)境 變量;
[0013] 調(diào)用模塊,適于根據(jù)JNI環(huán)境變量調(diào)用Java層API。
[0014] 根據(jù)本發(fā)明的Android系統(tǒng)中native層調(diào)用Java層API的方法和裝置,在native 線程運行時,將該native線程與其需要調(diào)用的Java層API對應(yīng)的JNI環(huán)境變量綁定,在 native線程需要調(diào)用Java層的API時,native線程直接獲取綁定的JNI環(huán)境變量,根據(jù)該 JNI環(huán)境變量即可調(diào)用Java層API。通過本方案,在native層調(diào)用Java層API的過程中, 省略了 Java層調(diào)用native層接口設(shè)置JNI環(huán)境變量的步驟,避免了 native層和Java層 之間頻繁的相互調(diào)用可能引起的程序崩潰、內(nèi)存泄露等問題,提高了效率。
[0015] 上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段, 而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠 更明顯易懂,以下特舉本發(fā)明的【具體實施方式】。
【附圖說明】
[0016] 通過閱讀下文優(yōu)選實施方式的詳細(xì)描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通 技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認(rèn)為是對本發(fā)明 的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
[0017] 圖1示出了根據(jù)本發(fā)明一個實施例的Android系統(tǒng)中native層調(diào)用Java層API 的方法的流程圖;
[0018] 圖2a示出了現(xiàn)有的Java層API調(diào)用方式的示意圖;
[0019] 圖2b示出了本發(fā)明實施例提供的Java層API調(diào)用方式的示意圖;
[0020] 圖3示出了根據(jù)本發(fā)明另一個實施例的Android系統(tǒng)中native層調(diào)用Java層 API的方法的流程圖;
[0021] 圖4示出了根據(jù)本發(fā)明一個實施例的Android系統(tǒng)中native層調(diào)用Java層API 的裝置的結(jié)構(gòu)框圖。
【具體實施方式】
[0022] 下面將參照附圖更詳細(xì)地描述本公開的示例性實施例。雖然附圖中顯示了本公開 的示例性實施例,然而應(yīng)當(dāng)理解,可以以各種形式實現(xiàn)本公開而不應(yīng)被這里闡述的實施例 所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍 完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
[0023] 在描述本發(fā)明各實施例之前,簡要介紹與本發(fā)明相關(guān)的概念以及本發(fā)明各實施例 適用的場景。
[0024] 如前文所述,Java是平臺無關(guān)的,因此有些底層的任務(wù)用Java實現(xiàn)起來并不容 易,例如,當(dāng)涉及本地服務(wù)、鏈接庫或硬件驅(qū)動等方面的任務(wù)時,通常需要運行C來實現(xiàn),而 C程序運行在native (本地方法)層。
[0025] 另一方面,由于大部分的用戶功能都在Java層提供,native線程會經(jīng)常需要調(diào)用 Java層API實現(xiàn)相應(yīng)的功能,例如,調(diào)用Java層用于彈窗API實現(xiàn)彈窗的操作。具體地, native 層和 Java 層通過 JNI (Java Native Interface ; Java,native 接口)交互,JNI 是一 組雙向的接口,開發(fā)者不僅可以通過JNI在Java層中調(diào)用native層接口,還可以在native 層中嵌入一個Java虛擬機(VM),并通過JNI訪問運行于虛擬機中的Java層API。也就是 說,JNI充當(dāng)一個橋梁的角色,它將Java虛擬機與native層聯(lián)系起來,從而實現(xiàn)了 Java層 與native層的相互調(diào)用。
[0026] 圖1示出了根據(jù)本發(fā)明一個實施例的Android系統(tǒng)中native層調(diào)用Java層API 的方法的流程圖,應(yīng)用于Android系統(tǒng)的native層中。如圖1所示,方法包括如下步驟:
[0027] 步驟Sl 10,根據(jù)native線程與Java層API之間的調(diào)用關(guān)系,將native線程與 Java層API對應(yīng)的JNI環(huán)境變量綁定。
[0028] Java層API (application programming interface,應(yīng)用編程接口)是Android提 供給應(yīng)用層程序或開發(fā)者的預(yù)定義函數(shù),實現(xiàn)特定的功能,包括Android圖形化API,例如, 彈窗API ;以及多媒體API,網(wǎng)絡(luò)API等。native線程(本地線程)是系統(tǒng)或程序在native 層中創(chuàng)建的線程,本發(fā)明中,請求調(diào)用Java層API的native線程包括模擬游戲線程、與圖 像運算有關(guān)的線程、復(fù)雜運算線程等。
[0029] 根據(jù)上文描述,在本發(fā)明適用的場景中,native線程和Java層API之間的調(diào)用關(guān) 系是已知并確定的。例如,native層中的模擬游戲線程運行中,將會響應(yīng)于用戶的特定操 作而需要調(diào)用Java層的彈窗API已進(jìn)行彈窗。則步驟SllO的一種實施方式是,當(dāng)該模擬 游戲線程在native層啟動時,就將其與可能要調(diào)用的Java層的彈窗API的JNI環(huán)境變量 綁定并在線程運行時保持綁定。
[0030] 具體地,Android系統(tǒng)中,通過虛擬機實現(xiàn)native線程與JNI環(huán)境變量的綁定。
[0031] 步驟S120,根據(jù)Java層API的調(diào)用請求,獲取與native線程綁定的JNI環(huán)境變 量。
[0032] 如上文所述,native線程通過JNI調(diào)用Java層API。每次調(diào)用時,native線程先 要獲取Java層API對應(yīng)的JNI環(huán)境變量。上述的Java層API調(diào)用請求可能來自于用戶操 作,例如,在當(dāng)前游戲中,用戶觸發(fā)游戲的UI界面導(dǎo)致需要彈框,其中,UI界面由Java層程 序提供,彈框操作