Java层与Jni层数据传递之Direct Buffer

基本

  • 共享内存的方式进行数据交换
  • 比普通数组传递效率高
  • 构造, 析构, 维护成本高, 所以适合长期频繁访问的大块内存区域
  • 关于Direct Buffer的内存情况查考:
    text

实现

  • java实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 主要用于测试Direct Buffer
public class DirectBufferOnClickListener implements OnClickListener {
@Override
public void onClick(View arg0) {
if (null == directBuffer) {
// 首先分配, 然后调用进行设置
directBuffer = ByteBuffer.allocateDirect(1024);
if (null == directBuffer) {
Log.d("JniDemo", "分配Direct Buffer失败!");
return ;
}

directBuffer.putChar('a');
directBuffer.putChar('c');
directBuffer.putChar('d');
directBuffer.putChar('d');
directBuffer.putChar('w');
directBuffer.putChar('j');
directBuffer.putChar('l');
jniDemo.setDirectBuffer(directBuffer, directBuffer.capacity());
}else{
// 测试数据是否设置进去了
directBuffer.putChar(';');
directBuffer.putChar('a');
directBuffer.putChar('h');
directBuffer.putChar('t');
directBuffer.putChar('6');
directBuffer.putChar('2');
directBuffer.putChar('8');
jniDemo.testDirectBufferContext(7);
}
}
}

//
  • C++端实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
unsigned char* g_directBuff = NULL;
int g_bufferLen = 0;
// 测试Direct Buffer
JNIEXPORT void JNICALL Java_com_dasea_ndkjnidemo_JniDemo_setDirectBuffer(
JNIEnv* env, jobject obj, jobject jdirectBuff, jint jcapacity) {
void* buffer = env->GetDirectBufferAddress(jdirectBuff);
if (NULL == buffer) {
LOGD_D("natilayer->setImageDirectBuffer ->Invalid buffer!");
return ;
}
g_bufferLen = static_cast<int>(jcapacity);
g_directBuff = static_cast<unsigned char*>(buffer);

// 一个put进去的字符占俩个字节, 所以%s不能直接显示, 所以需要循环显示
for(int i = 0; i < 20; ++i) {
LOGD_D("Buffer里面的数据为: %d", g_directBuff[i]);
}
LOGD_D("Buffer里面的数据为: %s, 容量为: %d", g_directBuff, g_bufferLen);
}

JNIEXPORT void JNICALL Java_com_dasea_ndkjnidemo_JniDemo_testDirectBufferContext(
JNIEnv* env, jobject obj, jint jlen) {
int len = jlen;
LOGD_D("有效数据长度为: %d", len);
for(int i = 0; i < 40; ++i) {
LOGD_D("Buffer里面的数据为: %d", g_directBuff[i]);
}
}