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

來源:互聯網
上載者:User

標籤:android   java   tar   width   get   http   

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的定義:

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

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

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

首先看Native.java的定義:

再看看native.c是如何?的:

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

三、 Direct Buffer 方式傳遞

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

首先看Native.java的定義:

再看看native.c是如何?的:

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.