91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發實踐:Java層與Jni層的數組傳遞

發布時間:2020-05-26 08:50:26 來源:網絡 閱讀:19630 作者:Jhuster 欄目:移動開發

Android開發中,經常會在Java代碼與Jni層之間傳遞數組(byte[]),一個典型的應用是Java層把需要發送給客戶端的數據流傳遞到Jni層,由Jni層的Socket代碼發送出去,當然,Jni層也需要把從Socket接收到的數據流返回給Java層。我簡單地總結了一下,從Java層到Jni層,從Jni層到JAVA層,各有3種傳遞方式,下面用代碼示例簡單地介紹一下。


示例代碼的主要文件有兩個,一個是Native.java,是Java層的類;另一個是Native.c,是JNI層的文件,關鍵的地方我都用注釋添加到代碼中了,完整的代碼見博文后面的附件。


一、 從Java傳遞數組到Jni層


Jni層接收到Java層傳遞過來的byte[]數組,一般有2個函數來獲取它的值,一個 GetByteArrayRegion,另一個是 GetByteArrayElements ,前者是進行值拷貝,將Java端數組的數據拷貝到本地的數組中,后者是指針的形式,將本地的數組指針直接指向Java端的數組地址,其實本質上是JVM在堆上分配的這個數組對象上增加一個引用計數,保證垃圾回收的時候不要釋放,從而交給本地的指針使用,使用完畢后指針一定要記得通過ReleaseByteArrayElements進行釋放,否則會產生內存泄露。


首先看Native.java的定義:


Android開發實踐:Java層與Jni層的數組傳遞


再看看對應的native.c的實現代碼:


Android開發實踐:Java層與Jni層的數組傳遞


二、 從Jni層傳遞數組到Java層


把Jni層定義的數組傳遞到Java層,一般有兩種方法,一種是通過native函數的返回值來傳遞,另一種是通過jni層回調java層的函數來傳遞,后者多用于jni的線程中。無論哪種方法,都離不開 SetByteArrayRegion 函數,該函數將本地的數組數據拷貝到了 Java 端的數組中。下面只介紹前一種方式,即通過native函數返回值的方式傳遞jni層的數組,回調的方式其實用法類似,就不詳細介紹了。


首先看Native.java的定義:


Android開發實踐:Java層與Jni層的數組傳遞

   再看看native.c是如何實現的:


Android開發實踐:Java層與Jni層的數組傳遞

由上述代碼示例可以看出,首先通過 NewByteArray 在堆上分配數組對象,然后通過SetByteArrayRegion 把本地的數組數據拷貝到堆上分配的數組中去,然后通過返回值將分配的數組對象返回到Java層即可。對于回調的方式,這幾步操作也是一樣的,唯一的不同是,回調方式不是以返回值的方式將數組對象返回給Java層,而是在回調函數中,以回調函數參數的形式返回給Java層。


三、 Direct Buffer 方式傳遞


Java和Jni層的數組傳遞還有一個比較重要的方式,就是通過Direct Buffer來傳遞,這種方式類似于在堆上創建創建了一個Java和Jni層共享的整塊內存區域,無論是Java層或者Jni層均可訪問這塊內存,并且Java端與Jni端同步變化,由于是采用的是共享內存的方式,因此相比于普通的數組傳遞,效率更高,但是由于構造/析構/維護這塊共享內存的代價比較大,所以小數據量的數組建議還是采用上述方式,Direct Buffer方式更適合長期使用頻繁訪問的大塊內存的共享。具體使用方法介紹如下:


首先看Native.java的定義:


Android開發實踐:Java層與Jni層的數組傳遞

再看看native.c是如何實現的:


Android開發實踐:Java層與Jni層的數組傳遞

由上述代碼可以看出,其中使用起來還是很簡單的,Jni層只需要通過GetDirectBufferAddress函數即可獲取到這塊共享的內存的地址,Direct Buffer的管理工作均由操作系統來負責。


四、 總結


關于Java與Jni層的數組傳遞就介紹到這里了,其實并不復雜,希望上述代碼對初學者能有所幫助,有任何疑問或者不清楚的地方歡迎留言或者來信lujun.hust@gmail.com交流,或者關注我的新浪微博 @盧_俊 獲取最新的文章和資訊。


附件:http://down.51cto.com/data/2364072
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泽州县| 石台县| 阿鲁科尔沁旗| 舞阳县| 砚山县| 南华县| 察哈| 子洲县| 辉南县| 喀什市| 乐昌市| 牡丹江市| 丰镇市| 旬邑县| 丹巴县| 突泉县| 彭山县| 平利县| 岚皋县| 健康| 汾阳市| 正阳县| 汝州市| 海口市| 曲靖市| 禹州市| 德清县| 济源市| 乐平市| 襄汾县| 尼勒克县| 自贡市| 丰城市| 台中市| 华坪县| 永康市| 汽车| 恭城| 莱西市| 广安市| 集贤县|