jni java返回数组_Android开发实践:Java层与Jni层的数组传递

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的定义:

2b0aa3351e6ebe4e55983d7c22c6432c.png

再看看对应的native.c的实现代码:

c1c075a0124a7260f8baa579980a787c.png

二、 从Jni层传递数组到Java层

把Jni层定义的数组传递到Java层,一般有两种方法,一种是通过native函数的返回值来传递,另一种是通过jni层回调java层的函数来传递,后者多用于jni的线程中。无论哪种方法,都离不开 SetByteArrayRegion 函数,该函数将本地的数组数据拷贝到了 Java 端的数组中。下面只介绍前一种方式,即通过native函数返回值的方式传递jni层的数组,回调的方式其实用法类似,就不详细介绍了。

首先看Native.java的定义:

d8f307b094f4e5df60c5f808a9aae52b.png

再看看native.c是如何实现的:

fe72d80a5aa7817b5c030c238f070e8a.png

由上述代码示例可以看出,首先通过 NewByteArray 在堆上分配数组对象,然后通过SetByteArrayRegion 把本地的数组数据拷贝到堆上分配的数组中去,然后通过返回值将分配的数组对象返回到Java层即可。对于回调的方式,这几步操作也是一样的,唯一的不同是,回调方式不是以返回值的方式将数组对象返回给Java层,而是在回调函数中,以回调函数参数的形式返回给Java层。

三、 Direct Buffer 方式传递

Java和Jni层的数组传递还有一个比较重要的方式,就是通过Direct Buffer来传递,这种方式类似于在堆上创建创建了一个Java和Jni层共享的整块内存区域,无论是Java层或者Jni层均可访问这块内存,并且Java端与Jni端同步变化,由于是采用的是共享内存的方式,因此相比于普通的数组传递,效率更高,但是由于构造/析构/维护这块共享内存的代价比较大,所以小数据量的数组建议还是采用上述方式,Direct Buffer方式更适合长期使用频繁访问的大块内存的共享。具体使用方法介绍如下:

首先看Native.java的定义:

c2c7297a5bec128c9b0ef52ca47971d3.png

再看看native.c是如何实现的:

290a947aabfc65297e71542d8d512b33.png

由上述代码可以看出,其中使用起来还是很简单的,Jni层只需要通过GetDirectBufferAddress函数即可获取到这块共享的内存的地址,Direct Buffer的管理工作均由操作系统来负责。

四、 总结

关于Java与Jni层的数组传递就介绍到这里了,其实并不复杂,希望上述代码对初学者能有所帮助,有任何疑问或者不清楚的地方欢迎留言或者来信lujun.hust@gmail.com交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsp mysql 注入_由Jsp+Mysql注入到root权限的全程展 【好久没有安全类文章了,转一篇看看】...

由JspMysql注入到root权限的全程展最近有点空闲,所以写点垃圾文章来消磨一下时间.文中没有什么技术含量,如果要转载,请注明作者并保持文章的完整.很多人可能都知道asp,php的编程要防止sql注入漏洞,而并不知道jsp编程同样也需要防备sql注入漏洞.其实,一旦jsp代码有注入漏洞,将直…

Divide and conquer:Dropping tests(POJ 2976)

最大化平均值 题目大意:给定你n个分数,从中找出k个数,使∑a/∑b的最大值 这一题同样的也可以用二分法来做(用DP会超时,可见二分法是多么的实用呵!),大体上是这样子:假设最…

java中标准封装结构_java中的构造,封装

今天给大家讲一下面向对象中的构造,封装;构造:构造方法有以下几个特点:1.方法名和类名一致。2.无返回类型。接下来的几种构造样式,直接上代码吧://这是一个宠物类 有一个属性:名字(name)public …

《白日梦想家》观后感

To see the world, things dangerous to come to, To see behind walls, to draw closer, To find each other and to feel That is the Purpose of LIFE.” 这部片子我很喜欢,大概我在现实生活中,也就是一个梦想家吧。想过很多事,但是真正去…

linux隐藏tomcat版本_Ubuntu 14.04隐藏Tomcat-7.0.52的版本号与操作系统类型

一般情况下,软件的漏洞信息和特定版本,特定操作系统是相关的,因此,软件的版本号以及操作系统类型对攻击者来说是很有价值的。在默认情况下,Tomcat会在返回信息中把自身的版本号,操作系统类型都显示出来&…

自定义tabbar

/** * 注意:* 打开自定义tabbar的背景视图的交互* 选中的tabb视图高度为tabbar背景视图的高度/2-选中视图高度/2* 选中视图加载到tabbar背景视图上* label注意居中,imgView注意选择适应模式,都加载到tabbar背景视图* 设置点击手势的点击事件…

php7与apache整合,apache集成php7.3.5的详细步骤

安装 php首先安装 php 的压缩包,目前下载地址解压文件到这个路径下:D:Program Filesphp-7.3.5(自行选择合适的路径).然后将这个路径加入到环境变量 path 中。然后打开 cmd 运行php -version,输出类似如下,说明安装成功。PHP 7.3.5 (cli) (bui…

php后门 佛像,35张活的再久,也未必见过的照片,图2是佛像通过CT扫描后内部照...

今天这组照片可能很多人都是一次见到,包括小编本人看了也十分惊讶。最大的感触是,很多的商品居然是这么做出来的,看完了才有一种豁然开朗的感觉,废话不多说一起看看吧。鸡蛋里面套鸡蛋1000年前佛像,经过CT扫描后&#…

droidbox官网

droidbox官网,droidbox已经移植到github上了 https://github.com/pjlantz/droidbox 转载于:https://www.cnblogs.com/nightnine/p/5169261.html

java实现缓存中间件,Redis,分布式系统中不可少的缓存中间件

1.为什么要用缓存内存在整个计算机系统来说也就是一个缓存,CPU操作内存速度很快;因为操作数据的时候,先从硬盘中取出数据放到内存中,然后CPU操作数据缓存:提升访问效率,将一些频繁访问地放在缓存里面image.…

matlab自带的人脸分类器,基于MATLAB,运用PCA+SVM的特征脸方法人脸识别

概述:此文章将要描述一种基于MATLAB平台,运用PCA主成分分析方法对图片数据进行降维,运用SVM支持向量机分类器对降维后的图片数据进行分类处理,从而达到人脸识别的目的。首先要感谢以下几篇文章的作者(后面引用会标识文章标号)2.PC…

J2EE的13个规范之(二) JDBC 及其使用

我想大家都知道ODBC是什么?ODBC(OpenDatabaseConnectivity。开放数据库互连)是微软公司开放服务结构(WOSA,WindowsOpenServicesArchitecture)中有关数据库的一个组成部分。它建立了一组规范,并提供了一组对数据库訪问的标准API(应…

被恶意上传了.php,轻松解决网站被恶意镜像

老听说有人的网站被恶意镜像,于是我先收藏几种解决方法。镜像站看似一个完整的站点,其实每次用户访问镜像站点,他的小偷程序就会来正版的网站查询数据,并修改相关链接然后呈献给用户。实质上还是在读取原站的数据,我们…

【代码笔记】iOS-对UIView进行截图

一,效果图。 二,工程图。 三,代码。 RootViewController.m #import "RootViewController.h"interface RootViewController ()endimplementation RootViewController- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBund…

mysql中括号_干货!Python与MySQL数据库的交互实战

作者 | Huang supreme,责编 | 郭芮头图 | CSDN 下载自视觉中国安装PyMySQL库如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接使用pip install pymysql;假如这种方式还是安装不上…

苹果天气不显示_热门天气APP被苹果拿下,安卓用户不能再使用

近日,Android平台最受欢迎的订阅式天气APP之一Dark Sky官方宣布其被苹果收购。收购后,Android和Wear OS上的Dark Sky APP都会在2020年7月1日下架,届时将关闭服务并提供退款,iOS版APP则不受影响。Dark Sky天气预报Dark Sky服务早就…

求n的阶乘的算法框图_算法|从阶乘计算看递归算法

欢迎点击「算法与编程之美」↑关注我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。1理解递归“程序设计是实践计算机思维的重要手段”。程序设计的三种特征就是封装、继承和多态。而对于…

Python成长之路_装饰器

一、初入装饰器 1、首先呢我们有这么一段代码,这段代码假设是N个业务部门的函数 1 def f1(aaa): 2 print(我是F1业务) 3 if aaa f1: 4 return ok 5 6 def f2(aaa): 7 print(我是F2业务) 8 if aaa f2: 9 return ok 业务代码这里的…

python卸载_删除系统 Python 引发的惨案

这个案例告诉我们,千万不要动系统自带的 Python,Win系统除外文 | fanzhenyu 出处 | http://fanzhenyu.cn/由于无知,卸载 Ubuntu 自带的 python3 引发惨案,谨记,深刻反思。惨案由于实验需要使用 Python3.6 以上版本&…

python3迭代器是什么,python3 迭代器

1. 想要了解 迭代器 ,需要先 知道什么是 可迭代对象。简单点说,可以直接作用于for循环的对象,称之为可迭代对象(Iterable)。1.png可迭代对象,一定实现了__iter__方法。isinstance內建函数,可以判断一个对象是否是某个类…