网站群管理建设工作,wordpress如何上传ppt,哈尔滨可以做网站的公司,做植物提取物的专业网站Android开发中#xff0c;经常会在Java代码与Jni层之间传递数组(byte[])#xff0c;一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层#xff0c;由Jni层的Socket代码发送出去#xff0c;当然#xff0c;Jni层也需要把从Socket接收到的数据流返回给Java层。我…Android开发中经常会在Java代码与Jni层之间传递数组(byte[])一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层由Jni层的Socket代码发送出去当然Jni层也需要把从Socket接收到的数据流返回给Java层。我简单地总结了一下从Java层到Jni层从Jni层到JAVA层各有3种传递方式下面用代码示例简单地介绍一下。示例代码的主要文件有两个一个是Native.java是Java层的类另一个是Native.c是JNI层的文件关键的地方我都用注释添加到代码中了完整的代码见博文后面的附件。一、 从Java传递数组到Jni层Jni层接收到Java层传递过来的byte[]数组一般有2个函数来获取它的值一个 GetByteArrayRegion另一个是 GetByteArrayElements 前者是进行值拷贝将Java端数组的数据拷贝到本地的数组中后者是指针的形式将本地的数组指针直接指向Java端的数组地址其实本质上是JVM在堆上分配的这个数组对象上增加一个引用计数保证垃圾回收的时候不要释放从而交给本地的指针使用使用完毕后指针一定要记得通过ReleaseByteArrayElements进行释放否则会产生内存泄露。首先看Native.java的定义再看看对应的native.c的实现代码二、 从Jni层传递数组到Java层把Jni层定义的数组传递到Java层一般有两种方法一种是通过native函数的返回值来传递另一种是通过jni层回调java层的函数来传递后者多用于jni的线程中。无论哪种方法都离不开 SetByteArrayRegion 函数该函数将本地的数组数据拷贝到了 Java 端的数组中。下面只介绍前一种方式即通过native函数返回值的方式传递jni层的数组回调的方式其实用法类似就不详细介绍了。首先看Native.java的定义再看看native.c是如何实现的由上述代码示例可以看出首先通过 NewByteArray 在堆上分配数组对象然后通过SetByteArrayRegion 把本地的数组数据拷贝到堆上分配的数组中去然后通过返回值将分配的数组对象返回到Java层即可。对于回调的方式这几步操作也是一样的唯一的不同是回调方式不是以返回值的方式将数组对象返回给Java层而是在回调函数中以回调函数参数的形式返回给Java层。三、 Direct Buffer 方式传递Java和Jni层的数组传递还有一个比较重要的方式就是通过Direct Buffer来传递这种方式类似于在堆上创建创建了一个Java和Jni层共享的整块内存区域无论是Java层或者Jni层均可访问这块内存并且Java端与Jni端同步变化由于是采用的是共享内存的方式因此相比于普通的数组传递效率更高但是由于构造/析构/维护这块共享内存的代价比较大所以小数据量的数组建议还是采用上述方式Direct Buffer方式更适合长期使用频繁访问的大块内存的共享。具体使用方法介绍如下首先看Native.java的定义再看看native.c是如何实现的由上述代码可以看出其中使用起来还是很简单的Jni层只需要通过GetDirectBufferAddress函数即可获取到这块共享的内存的地址Direct Buffer的管理工作均由操作系统来负责。四、 总结关于Java与Jni层的数组传递就介绍到这里了其实并不复杂希望上述代码对初学者能有所帮助有任何疑问或者不清楚的地方欢迎留言或者来信lujun.hustgmail.com交流。