Java层与Jni层数据传递之Direct Buffer Posted on 2016-08-12 基本 共享内存的方式进行数据交换 比普通数组传递效率高 构造, 析构, 维护成本高, 所以适合长期频繁访问的大块内存区域 关于Direct Buffer的内存情况查考:text 实现 java实现 1234567891011121314151617181920212223242526272829303132333435// 主要用于测试Direct Bufferpublic 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++端实现 12345678910111213141516171819202122232425262728unsigned char* g_directBuff = NULL;int g_bufferLen = 0;// 测试Direct BufferJNIEXPORT 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]); }}