GetByteArrayElements和GetByteArrayRegion的使用示例
GetByteArrayElements
官方解释为
获取数组内容,直到ReleaseByteArrayElements()被调用。
言下之意,就是在 ReleaseByteArrayElements 被调用之前 这个数据一直有效。
所以必须伴随有 ReleaseByteArrayElements 进行使用,是否会导致指针不被释放。
GetByteArrayRegion
官方解释为
从缓冲区中获取数组的数据。
其中 ReleaseByteArrayElements 官方释义
拷贝数组到第一个参数,并且释放第二个指针参数。
所以对应的 GetByteArrayElements 是申请内存 并拷贝数据后返回。
示例一 使用 GetByteArrayElements
// demo.cpp
#include "jni_main.h"static unsigned char* g_buf_in = NULL;
static unsigned char* g_buf_out = NULL;int jni_debug_bytes(JNIEnv *jenv, jobject thiz, jbyteArray buf_in, jbyteArray buf_out){ehome_printf("[%s]GetByteArrayElements\n", __FUNCTION__);int len_arr = 0;g_buf_in = (uint8_t *)jenv->GetByteArrayElements(buf_in, NULL);// g_buf_out 可以使用 GetByteArrayElements 进行初始化,也可以在后面使用 malloc 进行初始化//g_buf_out = (uint8_t *)jenv->GetByteArrayElements(buf_out, NULL); if(g_buf_out){for(int i=0; i<10; i++){ehome_printf("g_buf_out : %c", g_buf_out[i]);}}else{ehome_printf("[%s]g_buf_out:NULL\n", __FUNCTION__);g_buf_out = (unsigned char*)malloc(1024);}for(int i=0; i<50; i++){g_buf_out[i] = i+20;}len_arr = jenv->GetArrayLength(buf_in);// buf_in len: 100ehome_printf("[%s]buf_in len:%d\n", __FUNCTION__, len_arr);len_arr = jenv->GetArrayLength(buf_out);// buf_in len: 120ehome_printf("[%s]buf_out len:%d\n", __FUNCTION__, len_arr);for(int i=0; i<10; i++){ehome_printf("%c", g_buf_in[i]);}// ReleaseByteArrayElements:// copy back the content and free the elems[g_buf_in] bufferjenv->ReleaseByteArrayElements(buf_in, (int8_t*)g_buf_in, 0);jenv->ReleaseByteArrayElements(buf_out, (int8_t*)g_buf_out, 0);return 1;
}
示例二 使用 GetByteArrayRegion【推荐使用】
// demo.cpp
#include "jni_main.h"static unsigned char* g_buf_in = NULL;
static unsigned char* g_buf_out = NULL;static void init_buffer(){g_buf_in = (unsigned char*)malloc(1024);g_buf_out = (unsigned char*)malloc(1024);memset(g_buf_out, 0, 1024);for(int i=0; i<50; i++){g_buf_out[i] = i;}
}int jni_debug_bytes(JNIEnv *jenv, jobject thiz, jbyteArray buf_in, jbyteArray buf_out){if(NULL == g_buf_in){init_buffer();}int len_arr = 0;jenv->GetByteArrayRegion(buf_in, 0, 100, (jbyte*)g_buf_in);len_arr = jenv->GetArrayLength(buf_in);// len_arr: 100ehome_printf("[%s]buf_in len:%d\n", __FUNCTION__, len_arr);len_arr = jenv->GetArrayLength(buf_out);// len_arr: 120ehome_printf("[%s]buf_out len:%d\n", __FUNCTION__, len_arr);for(int i=0; i<10; i++){ehome_printf("%c", g_buf_in[i]);}jenv->SetByteArrayRegion(buf_out, 0, 100,(jbyte *)g_buf_out);return 1;
}
上层 JAVA 使用调用
// C 声明 {"jni_debug_bytes","([B[B)I",(void *) jni_debug_bytes},
public native int jni_debug_bytes(byte[] buf_in, byte[] buf_out);private void on_set_byte_debug() {byte[] buf_in = new byte[100];byte[] buf_out = new byte[120];for(byte i=0; i<100; i++) {buf_in[i] = (byte) ('A'+ i);buf_out[i] = (byte) ('a'+ i);}jniclass.jni_debug_bytes(buf_in, buf_out);for(byte i=0; i<10; i++) {Log.i("MainAcitivty", "buf_out : " + buf_out[i]);}
}
运行后会把 A B C D… J 传入
得到结果为 20 21 22 23 … 29
附其中的基本类型
typedef | unsigned char | jboolean |
typedef | signed char | jbyte |
typedef | unsigned short | jchar |
typedef | short | jshort |
typedef | int | jint |
typedef | int | jsize |
GetByteArrayElements和GetByteArrayRegion的使用示例相关推荐
- 【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★
文章目录 一.主应用 二.代理 Application 解析 1.代理 Application 源码 2.反射对象成员以及方法的工具类 3.压缩解压缩工具类 4.OpenSSL 解密工具类 5.Ope ...
- ffmpeg综合应用示例(三)——安卓手机摄像头编码
本文的示例将实现:读取安卓手机摄像头数据并使用H.264编码格式实时编码保存为flv文件.示例包含了 1.编译适用于安卓平台的ffmpeg库 2.在java中通过JNI使用ffmpeg 3.读取安卓摄 ...
- .net连接mysql数据_.net连接MYSQL数据库的方法及示例!
连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...
- CPU Cache原理与示例
CPU Cache原理与示例 基础知识 现在的 CPU 多核技术,都会有几级缓存,老的 CPU 会有两级内存(L1 和 L2),新的CPU会有三级内存(L1,L2,L3 ),如下图所示: 其中: ...
- 编译器 llvm clang 源码转换示例
编译器 llvm clang 源码转换示例 从git获取llvm项目的源码方式: git clone https://github.com/llvm/llvm-project.git 下载源码后,进入 ...
- Cache Memory技术示例
Cache Memory技术示例 为什么需要cache?如何判断一个数据在cache中是否命中?cache的种类有哪些,区别是什么? 为什么需要cache memory 先思考第一个问题:程序是如何运 ...
- Swift与LLVM-Clang原理与示例
Swift与LLVM-Clang原理与示例 LLVM 学习 从 简单汇编基础 到 Swift 不简单的 a + 1 作为iOS开发,程序崩溃犹如家常便饭,秉着没有崩溃也要制造崩溃的原则 每天都吃的很饱 ...
- C语言与OpenCL的编程示例比较
C语言与OpenCL的编程示例比较 OpenCL支持数据并行,任务并行编程,同时支持两种模式的混合.对于同步 OpenCL支持同一工作组内工作项的同步和命令队列中处于同一个上下文中的 命令的同步. 在 ...
- OpenCL框架与示例
OpenCL框架与示例 下面的图简单说明了OpenCL的编程框架,图是用的GPU,其他类似: 名词的概念: Platform (平台):主机加上OpenCL框架管理下的若干设备构成了这个平台,通过这个 ...
最新文章
- php配置默认index.php,Apache的vhost中配置默认访问入口index-test.php的方法(Yii)
- 【技术贴】五分钟解决打开软件提示windows正在设置Microsoft Office Profes
- Rabbit的Windows安装
- php 数组美化_php 打印数组格式化显示
- U3D 文档 GPU INSTANCING
- 陈华钧 | 知识图谱构建,将成为智能金融的突破口
- 最佳调度问题(搜索回溯)
- JSP中乱码问题,你真的理解了么?
- 绘图之使用工作空间直接绘图
- Java 在Word创建表格
- 【hdu - 2568】ACM程序设计期末考试081230
- C# winform推荐波形图表控件scottplot
- 2019年7月中国编程语言排行榜,Julia工资近四万
- VB作业之生成随机数
- Python视频字幕识别——pytesseract
- 骨传导耳机和普通耳机危害哪个小?骨传导耳机
- 生产计划:制定您的生产流程
- 读懂DeFi四大金融原语的演变:流动性、杠杆、风险和套利
- python内推群_重要!!!陌陌2020校招Python内推通道(含内推直链)
- 外媒眼中的乔布斯:他就是苹果
热门文章
- Mysql crash
- IE8 ie9 浏览器“会话”问题
- “不患寡而患不均”是孔子的名言
- 如何解决 img 标签的 src 属性存在跨域问题
- 一、全Flash网站和单个Flash作品制作的区别
- 【附源码】Java计算机毕业设计安卓运动健康app(程序+LW+部署)
- JavaScript 判断 Chrome 内核的 360 浏览器
- 简明代码实现Unet眼底图像血管分割
- [附源码]PHP计算机毕业设计电影院售票系统论文(程序+LW)
- 两条命令快速关闭windows 445端口