Android在JNI中使用ByteBuffer的方法

來源:互聯網
上載者:User

   Android在JNI中使用ByteBuffer的方法

  本文執行個體講述了Android在JNI中使用ByteBuffer的方法。分享給大家供大家參考。具體如下:

  一、ByteBuffer 定義

  在NIO中,資料的讀寫操作始終是與緩衝區相關聯的(讀取時通道(SocketChannel)將資料讀入緩衝區,寫入時首先要將發送的資料按順序填入緩衝區)

  緩衝區是定長的,基本上它只是一個列表,它的所有元素都是基礎資料型別 (Elementary Data Type)。ByteBuffer是最常用的緩衝區,它提供了讀寫其他資料類型的方法,且通道的讀寫方法只接收ByteBuffer。

  ByteBuffer有以下幾種常見屬性:

  mark:初始值為-1,標記索引地點;

  position:初始值為0,索引下標;

  limit:最好定義成bytebuffer的長度,即允許可讀空間長度;

  capacity:緩衝區能容納的資料元素的最大數量,建立之後無法被改變;

  二、ByteBuffer使用

  1. 建立ByteBuffer

  ① 使用allocate()建立:

  ?

1 2 ByteBuffer buf = ByteBuffer.allocate(length); //length表示buf的長度

  ② 使用數組建立:

  ?

1 2 ByteBuffer buf = ByteBuffer.wrap(byteArray); //byteArray表示一個數組

  2. 迴繞緩衝區

  ?

1 buf.flip();

  這個方法用來將緩衝區準備為資料傳出狀態,執行以上方法後,輸出通道會從資料的開頭而不是末尾開始.迴繞保持緩衝區中的資料不變,只是準備寫入而不是讀取。

  3. 清除緩衝區

  ?

1 buf.clear();

  這個方法實際上也不會改變緩衝區的資料,而只是簡單的重設了緩衝區的主要索引值.不必為了每次讀寫都建立新的緩衝區,那樣做會降低效能.相反,要重用現在的緩衝區,在再次讀取之前要清除緩衝區。

  4. ByteBuffer與byte[]互動

  ?

1 2 3 4 5 6 7 byte[] bytearray = new byte[10]; ByteBuffer buf = ByteBuffer.wrap(bytearray); //將數組寫入buf bytearray = new byte[buf.remaining()]; buf.get(bytearray,0,bytearray.length()); //將資料讀到數組中 bytearray = new byte[buf.capacity()];

  三、ByteBuffer與JNI互動

  在Java1.4版本中引入的JNI有三個函數可以用於NIO的直接緩衝器。一個直接位元組緩衝器是一個用於位元組資料的容器,Java將儘力在它上面執行本機I/O操作。JNI定義了三個用於NIO操作的函數。

  基於到儲存空間地址的指標以及儲存空間長度(容量),函數分配並且返回一個新的Java.nio.ByteBuffer。如果函數沒有針對當前Java虛擬機器實現,則返回NULL,或者拋出一個異常。如果沒有儲存空間可用,則將會拋出一個OutOfMemoryException。

  ?

1 jobject NewDirectByteBuffer(void* address, jlong capacity);

  GetDirectBufferAddress函數返回一個指向被傳入的java.nio.ByteBuffer對象的地址指標。如果函數尚未針對當前虛擬機器實現,或者如果buf不是java.nio.ByteBuffer的一個對象,又或者儲存空間區尚未定義,則都將返回NULL。

  ?

1 void* GetDirectBufferAddress(jobject buf);

  GetDirectBufferCapacity函數返回被傳入的java.nio.ByteBuffer對象的容量(以位元組計數)。如果函數沒有針對當前環境實現,或者如果buf不是java.nio.ByteBuffer類型的對象返回-1。

  ?

1 jlong GetDirectBufferCapacity(jobject buf);

  1. Jni中調用

  Java層:

  ?

1 public final int processData(ByteBuffer data);

  Native 介面:

  ?

1 private native long native_Process(ByteBuffer data);

  Jni層:

  ?

1 static jlong native_Process(JNIEnv *env,jobject obj,jobject data);

  注意ByteBuffer在JNI層中的簽名:Ljava/nio/ByteBuffer;

  2. 樣本(C++):

  ?

1 2 3 4 5 jclass cls = env->GetObjectClass(obj); jfieldID fid = env->GetFieldID(cls, "data","Ljava/nio/ByteBuffer;"); jobject bar = env->GetObjectField(obj, fid); pImageData->data= (MByte*)env->GetDirectBufferAddress(bar); //data是結構體pImageData中的byte[];

  希望本文所述對大家的Android程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.