激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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程序設計有所幫助。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 日韩精品中文字幕一区二区 | 久久情爱网 | 91av在线免费播放 | 久久久久久久久久久久网站 | 97精品视频在线观看 | 亚洲成人在线视频网 | 久久精品视频1 | 国产精品爆操 | 视频二区国产 | 成人偷拍片视频在线观看 | 久久免费观看一级毛片 | 少妇的肉体2无删减版 | 亚洲午夜1000理论片aa | 国产精品午夜未成人免费观看 | 久久亚洲春色中文字幕久久 | 成人福利在线播放 | 92看片淫黄大片欧美看国产片 | 鲁丝片一区二区三区免费入口 | 亚洲热线99精品视频 | 99成人在线 | 激情小说激情图片激情电影 | 黄色片网站免费看 | 中文字幕伦乱 | 亚州精品天堂中文字幕 | 日本不卡二区 | 人禽l交免费视频观看 视频 | 成人黄色在线电影 | 韩国精品视频在线观看 | 日韩av成人 | h网站在线观看 | 久久99网 | 一区二区网 | 中文字幕亚洲一区二区三区 | 毛片毛片免费看 | 一级黄色片武则天 | 国产精品啪一品二区三区粉嫩 | 国产一级在线看 | 草草视频免费观看 | 久久97视频| 国产成人在线播放视频 | 国产精品一区二区三区在线 |