jni数组使用(一)

假设有这样一个java函数:

[java] view plain copy
  1. public int Send(char buffer[],int length)

这个函数需要调用c/c++函数

[cpp] view plain copy
  1. 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的获取元素函数为:

[cpp] view plain copy
  1. jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)

对应的释放函数为:

[cpp] view plain copy
  1. void ReleaseCharArrayElements(jcharArray array, jchar* elems,jint mode)

另外还有获取数组指定范围元素的函数为:

[cpp] view plain copy
  1. void GetCharArrayRegion(jcharArray array, jsize start, jsize len, jchar* buf)

获取到数据元素之后,还可以设置数据元素,对应的函数是Get/Set<Type>ArrayRegion

下面看看Java的send函数如何调用c++层的send函数:

[cpp] view plain copy
  1. static int jni_send
  2. (JNIEnv *env, jobject obj, jcharArray buffer, jint length)
  3. {
  4. jchar *array;
  5. jboolean *buf;
  6. int i;
  7. int res;
  8. LOGD("jni_radio_send");
  9. array = env->GetCharArrayElements( buffer, NULL);//复制数组元素到array内存空间
  10. if(array == NULL){
  11. LOGE("jni_radio_send: GetCharArrayElements error.");
  12. return 0;
  13. }
  14. buf = (jboolean *)calloc(length , sizeof(jboolean));//开辟jboolean类型的内存空间,jboolean对应的c++类型为unsigned char
  15. if(buf == NULL){
  16. LOGE("jni_radio_send: calloc error.");
  17. return 0;
  18. }
  19. for(i=0; i < length; i++){//把jcharArray的数据元素复制到buf所指的内存空间
  20. *(buf + i) = (jboolean)(*(array + i));
  21. //LOGD("buf[%d]=%c\n",i,*(buf+i));
  22. }
  23. env->ReleaseCharArrayElements(buffer, array, 0);//释放资源
  24. res = send(buf, length);//调用c++的send函数
  25. free(buf);//释放内存空间
  26. buf = NULL;
  27. return res;
  28. }

下一篇将介绍在回调函数中如何使用数组

jni数组使用(一)相关推荐

  1. jni数组使用(二)

    jni数组使用(二) 上一篇说到在java中调用c++函数中,如何使用jni数组. 下面谈一谈在回调中如何使用jni数组. 假如有一个java函数: [cpp] view plain copy pub ...

  2. c++ java setobjectarrayelement_Android jni中数组参数的传递方式

    1.背景 今天调试了一下Android jni关于Java中调用C代码的程序,发现我的数组参数传递方式不对,导致值传递不正确,我的方法是: C代码,入口函数 #include #include jin ...

  3. Android NDK学习:JNI中的数组、引用和异常的处理

    JNI的文档 https://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html JNI数组操作 调用数组 Java ...

  4. JNI中参数的传递与操作

    Jni中C++和Java的参数传递 如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章: 利用 ...

  5. Android NDK学习笔记2:数组

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119152933 本文出自[赵彦军的博客] 文章目录 java数组和jni数组对应关 ...

  6. 安卓逆向_15( 一 ) --- JNI 和 NDK

    From:较详细的介绍JNI:https://blog.csdn.net/lizhifa2011/article/details/21021177 From:https://www.jb51.net/ ...

  7. JNI 简明教程之手把手教你入门

    1. 序言 有些时候,我们不可避免地要在 Java 中使用 native 代码(例如 C/C++),或是为了运行效率,或是为了不重复造轮子直接使用已有的 C/C++ 类库,或是为了防止被反编译. JN ...

  8. C++和JNI的数据转换

    如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章: 利用VC++6.0实现JNI的最简单的例 ...

  9. NDK - JNI官方中文资料

    NDK-JNI官方中文资料 声明 该篇文章完全引用自<JNI完全手册>完整版,用来方便查询查阅.感谢原文档作者. 文档所依赖的版本是比较低的,但是恰恰是低版本才能更容易上手学习.文档也有些 ...

最新文章

  1. 10篇顶会paper,入选微软学者,上海交大吴齐天的科研思考!
  2. Spring+Dubbo+Zookeeper简单框架与使用
  3. 【011】◀▶ C#学习(八) - IO命名空间
  4. websocket java 测试_Java后端WebSocket的Tomcat实现
  5. 弱口令上传shell_emlog后台拿shell
  6. layui --- [结构优化]参数优化
  7. 新手网页设计提高设计水平的法宝,临摹练习!
  8. 用NAnt 将StarTeam中的文件CheckOut回本地计算机
  9. Array.prototype.slice.call()如何工作?
  10. php beanstalkd使用,PHP使用Beanstalkd实例详解
  11. mysql 无法退出sql命令行编辑
  12. mysql数据库之基本函数,列属性,数据库管理
  13. UI设计(PS+AI)入门教程【视频+素材】
  14. 如何用 AppCube,实现那个曾经因为火,而被“封杀”的项目 Working Time丨【玩转应用魔方】
  15. CSP应用开发-将USBkey中的证书注册到Windows系统
  16. 王者荣耀原画模型与游戏模型对比,刘禅瞬间变尔康
  17. Win11自带录屏功能怎么使用
  18. 电脑中恶意插件后自动安装软件一般有哪些?(软件及安装路径整理中,持续更新)
  19. 「九霄龙吟」强龙启动打首板,选股公式指标公式,限时分享 高胜率
  20. 算法训练 P0604

热门文章

  1. 文本检查点web_reg_find和web_find两个函数的区别
  2. Fragment问题集
  3. source insight 使用技巧
  4. WebSphere社区版,Geronimo1.1八卦和GBean架构
  5. 用perl操作excel的介绍
  6. 高效开发Android App的10个建议
  7. 【机器学习】隐马尔可夫模型及其三个基本问题(二)观测序列概率计算算法及python实现
  8. 微信公众号-回复消息触发时间绑定EventKEY
  9. Java中IDEA,Springboot实现手机获取验证码和倒计时
  10. prometheus 发送恢复 值_基于prometheus+grafana+alertmanager监控系统配置钉钉告警