jni数组使用(一)
jni数组使用(一)
假设有这样一个java函数:
- public int Send(char buffer[],int length)
这个函数需要调用c/c++函数
- int send(unsigned char *buf, int len)
实现,那么用JNI该如何实现?
首先分析java的参数char buffer[ ],它在jni中的对应类型为jcharArray,说明从java传到jni的参数类型就是jcharArray。
jcharArray是一个jni数组类型,操作数组在jni中都有特定的函数,例如获取数据元素有:GetXXXArrayElements,XXX表示数据类型,可用如下数据类型替代:
jobjectArray;
jbooleanArray;
jbyteArray;
jcharArray;
jshortArray;
jintArray;
jlongArray;
jfloatArray;
jdoubleArray;
例如jcharArray的获取元素函数为:
- jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)
对应的释放函数为:
- void ReleaseCharArrayElements(jcharArray array, jchar* elems,jint mode)
另外还有获取数组指定范围元素的函数为:
- void GetCharArrayRegion(jcharArray array, jsize start, jsize len, jchar* buf)
获取到数据元素之后,还可以设置数据元素,对应的函数是Get/Set<Type>ArrayRegion
下面看看Java的send函数如何调用c++层的send函数:
- static int jni_send
- (JNIEnv *env, jobject obj, jcharArray buffer, jint length)
- {
- jchar *array;
- jboolean *buf;
- int i;
- int res;
- LOGD("jni_radio_send");
- array = env->GetCharArrayElements( buffer, NULL);//复制数组元素到array内存空间
- if(array == NULL){
- LOGE("jni_radio_send: GetCharArrayElements error.");
- return 0;
- }
- buf = (jboolean *)calloc(length , sizeof(jboolean));//开辟jboolean类型的内存空间,jboolean对应的c++类型为unsigned char
- if(buf == NULL){
- LOGE("jni_radio_send: calloc error.");
- return 0;
- }
- for(i=0; i < length; i++){//把jcharArray的数据元素复制到buf所指的内存空间
- *(buf + i) = (jboolean)(*(array + i));
- //LOGD("buf[%d]=%c\n",i,*(buf+i));
- }
- env->ReleaseCharArrayElements(buffer, array, 0);//释放资源
- res = send(buf, length);//调用c++的send函数
- free(buf);//释放内存空间
- buf = NULL;
- return res;
- }
下一篇将介绍在回调函数中如何使用数组
jni数组使用(一)相关推荐
- jni数组使用(二)
jni数组使用(二) 上一篇说到在java中调用c++函数中,如何使用jni数组. 下面谈一谈在回调中如何使用jni数组. 假如有一个java函数: [cpp] view plain copy pub ...
- c++ java setobjectarrayelement_Android jni中数组参数的传递方式
1.背景 今天调试了一下Android jni关于Java中调用C代码的程序,发现我的数组参数传递方式不对,导致值传递不正确,我的方法是: C代码,入口函数 #include #include jin ...
- Android NDK学习:JNI中的数组、引用和异常的处理
JNI的文档 https://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html JNI数组操作 调用数组 Java ...
- JNI中参数的传递与操作
Jni中C++和Java的参数传递 如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章: 利用 ...
- Android NDK学习笔记2:数组
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119152933 本文出自[赵彦军的博客] 文章目录 java数组和jni数组对应关 ...
- 安卓逆向_15( 一 ) --- JNI 和 NDK
From:较详细的介绍JNI:https://blog.csdn.net/lizhifa2011/article/details/21021177 From:https://www.jb51.net/ ...
- JNI 简明教程之手把手教你入门
1. 序言 有些时候,我们不可避免地要在 Java 中使用 native 代码(例如 C/C++),或是为了运行效率,或是为了不重复造轮子直接使用已有的 C/C++ 类库,或是为了防止被反编译. JN ...
- C++和JNI的数据转换
如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章: 利用VC++6.0实现JNI的最简单的例 ...
- NDK - JNI官方中文资料
NDK-JNI官方中文资料 声明 该篇文章完全引用自<JNI完全手册>完整版,用来方便查询查阅.感谢原文档作者. 文档所依赖的版本是比较低的,但是恰恰是低版本才能更容易上手学习.文档也有些 ...
最新文章
- 10篇顶会paper,入选微软学者,上海交大吴齐天的科研思考!
- Spring+Dubbo+Zookeeper简单框架与使用
- 【011】◀▶ C#学习(八) - IO命名空间
- websocket java 测试_Java后端WebSocket的Tomcat实现
- 弱口令上传shell_emlog后台拿shell
- layui --- [结构优化]参数优化
- 新手网页设计提高设计水平的法宝,临摹练习!
- 用NAnt 将StarTeam中的文件CheckOut回本地计算机
- Array.prototype.slice.call()如何工作?
- php beanstalkd使用,PHP使用Beanstalkd实例详解
- mysql 无法退出sql命令行编辑
- mysql数据库之基本函数,列属性,数据库管理
- UI设计(PS+AI)入门教程【视频+素材】
- 如何用 AppCube,实现那个曾经因为火,而被“封杀”的项目 Working Time丨【玩转应用魔方】
- CSP应用开发-将USBkey中的证书注册到Windows系统
- 王者荣耀原画模型与游戏模型对比,刘禅瞬间变尔康
- Win11自带录屏功能怎么使用
- 电脑中恶意插件后自动安装软件一般有哪些?(软件及安装路径整理中,持续更新)
- 「九霄龙吟」强龙启动打首板,选股公式指标公式,限时分享 高胜率
- 算法训练 P0604
热门文章
- 文本检查点web_reg_find和web_find两个函数的区别
- Fragment问题集
- source insight 使用技巧
- WebSphere社区版,Geronimo1.1八卦和GBean架构
- 用perl操作excel的介绍
- 高效开发Android App的10个建议
- 【机器学习】隐马尔可夫模型及其三个基本问题(二)观测序列概率计算算法及python实现
- 微信公众号-回复消息触发时间绑定EventKEY
- Java中IDEA,Springboot实现手机获取验证码和倒计时
- prometheus 发送恢复 值_基于prometheus+grafana+alertmanager监控系统配置钉钉告警