一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android在JNI中使用ByteBuffer的方法

Android在JNI中使用ByteBuffer的方法

2021-03-17 15:24滄海一粟 Android

這篇文章主要介紹了Android在JNI中使用ByteBuffer的方法,涉及Android中緩沖區的相關使用技巧,需要的朋友可以參考下

本文實例講述了AndroidJNI中使用ByteBuffer的方法。分享給大家供大家參考。具體如下:

一、ByteBuffer 定義

在NIO中,數據的讀寫操作始終是與緩沖區相關聯的(讀取時信道(SocketChannel)將數據讀入緩沖區,寫入時首先要將發送的數據按順序填入緩沖區)
緩沖區是定長的,基本上它只是一個列表,它的所有元素都是基本數據類型。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程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一区二区在线免费观看 | 免费一级特黄特色大片在线观看 | 色综合天天娱乐综合网 | 奇米影视在线视频8888 | 热99re国产久热在线 | 5g影院天天5g爽天天看 | 久久视频在线视频观看精品15 | 日本一区二区免费在线 | 天美影视传媒mv直接看 | 日韩在线成人 | 欧乱色国产精品兔费视频 | 国产一级毛片外aaaa | 91国内精品线免费播放 | 久久久久久久久人体 | 久久久无码精品无码国产人妻丝瓜 | 美女在尿口隐私视频 | 国产ab| 久久国产精品高清一区二区三区 | 精品久久久久亚洲 | 美女的隐私视频免费看软件 | 99网站在线观看 | 我将她侵犯1~6樱花动漫在线看 | 国产亚洲精品一区二区在线观看 | 久久九九精品国产自在现线拍 | 国产欧美日韩精品一区二 | 三极黄色| 亚洲国产五月综合网 | 欧洲女同同性videos0 | 99人中文字幕亚洲区 | 日本一区二区三区久久精品 | 1024国产精品视频观看 | 九九99香蕉在线视频美国毛片 | 免费观看日本人成影片 | 8插8插| 精品福利一区二区免费视频 | 欧美vpswindowssex| 好男人好资源在线观看 | 国产精品久久免费观看 | 日本午夜影院 | 国产亚洲综合久久 | 亚洲精品成人AV在线观看爽翻 |