您的位置:首页 > 移动开发 > Android开发

于 Android NDK 的学习之旅-----数据传输(基本数据类型和数组传输)

2016-12-09 09:55 387 查看
之前的一些文章都有涉及到上层和中间层的数据传输,简单来说,也就是参数和返回值的使用。因为中间层要做的最多的也就是数据传输与转换,下面来介绍下这方面的知识。

数据传输可分为 基本数据类型传输 和 引用数据类型的传输 , 因为数组传输也比较特别(其实数组也是引用类型),所以这里也专门分出来讲讲。

1、主要流程

1、 基本数据类型的传输

a) 上层定义一个native的方法,需要一个int 参数 ,返回一个int值

b) JNI 对应 上层的方法 , 打印出 上层 传输下来的 int数据,并返回 int数据

c) 上层 收到 native 方法 返回的 值,在UI中显示出来

2、 数组的传输

a) 上层定义一个native的方法,需要一个int数组,返回一个int数组

b) JNI 对应上层的方法,取出上层传递数组中的数据处理和打印出来,并存入新数组中,最后把该数组返回给 Java层

c) 上层 收到 native返回的 数组,加工成字符串,在UI中显示出来

2设计实现

1、 界面设计如下:

老老样子,很搓,嘿嘿

代码不在这贴出了,有需要的兄弟直接到文章结束部分下载。

2、 关键代码说明

Java 上层:

  MainActivity.java

  

  

定义两个native方法, 第一个是 用来 测试传输 基本数据类型的,第二个是用来测试 传输数组的。

Android.mk 文件

  

老样子,不说了,你懂的。 如果不懂,嘎嘎,那就请点击Android.mk 文件 简介咯

JNI 中间层

Transmission.c

  

3、运行结果

测试 基本数据类型传输: 输入 22 , 点击 计算 得出结果 44

查看 打印 信息 :看到 上层输出 结果

测试 引用数据类型传输:输入11,22,33,44,55 ( 逗号是在英文状态下半角输入) ,点击生成, 输出 22,44,66,88,100

查看 打印信息 : 看到JNI层输出 结果

以上就是 Java --- JNI 基本数据类型 和 数组 传输的 小例子 , 其他 基本数据类型和数组 都可以仿照上面的做法传输。

4、注意点

你必须知道的是:

1) 添加参数在(JNIEnv* env,jobject thiz) 后面添加 如:(JNIEnv* env,jobject thiz,jintArray nums )

2) 获取数组的长度 jsize len = (*jniEnv)->GetArrayLength(jniEnv, nums);

3) 新建数组 jintArray array = (*jniEnv)-> NewIntArray(jniEnv, len); 如果是新建别的数组,NewIntArray 要做相对应的改变

4) 获取 数组里面的元素:

(*env)->GetIntArrayElements(env, nums, isCopy) , 返回 所有数据。If isCopy is not NULL, then *isCopy is set to JNI_TRUE if a copy is made; if no copy is made, it is set to JNI_FALSE.

(*env)->GetIntArrayRegion(env,array,start,len,buffer) , 从start开始复制长度为len 的数据到buffer中

5) 设置 数组里面的元素

(*env)->SetIntArrayRegion(env, array,start,len,buffer) , 从start开始复制长度为len 的数据 buffer到 array 中

有不理解的兄弟请留言,个人技术有限,有讲错的地方请大牛们指出,讲的不够全面的请多多包涵,谢谢,

点击下载源码 数据的传输一

本文出自 duicky 博客 , 转载请注明出处 http://www.cnblogs.com/luxiaofeng54/archive/2011/08/19/2145486.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐