C++ – Jni中的GetByteArrayElements和GetByteArrayRegion的区别和使用示例
1 Jni中的GetByteArrayElements和GetByteArrayRegion的区别和使用示例
在通过Jni接口从Java层向C/C++传递字节数组时,经常会使用GetByteArrayElements
和GetByteArrayRegion
两种方法获取字节数组。
1.1 GetByteArrayElements
GetByteArrayElements
用于获取数组内容,直到ReleaseByteArrayElements()
被调用。
意思就是在ReleaseByteArrayElements
被调用之前 这个数据一直有效。
所以使用GetByteArrayElements
就必须使用ReleaseByteArrayElements
,否则会造成内存泄漏。
其使用示例如下:
JNIEXPORT jint JNICALL Java_com_abc_jni_process(JNIEnv* env, jobject,jbyteArray image_list_data)
{
jbyte* jbyte_image_list_data = env->GetByteArrayElements(image_list_data, 0);
jsize jbyte_image_list_data_len = env->GetArrayLength(image_list_data);
unsigned char* c_image_list_data = new unsigned char[jbyte_image_list_data_len];
memcpy(c_image_list_data, (unsigned char*)jbyte_image_list_data, jbyte_image_list_data_len);
// 进行逻辑处理
// do something...
// 释放内存
env->ReleaseByteArrayElements(image_list_data, jbyte_image_list_data, 0);
delete[] c_image_list_data;
return 1;
}
1.2 GetByteArrayRegion
GetByteArrayRegion
从缓冲区中获取数组的数据。事先在C/C++中创建一个缓存区,然后将Java中的原始数组拷贝到缓冲区中去。拷贝数组到第一个参数,并且释放第二个指针参数。
这种方法的优点:
- 只需要一个JNI调用而不是两个, 减少开销.
- 不需要对原始数据进行限制或者额外的拷贝数据
- 防止忘记主动调用ReleaseByteArrayElements出现内存泄漏的问题
JNIEXPORT jint JNICALL Java_com_abc_jni_process(JNIEnv* env, jobject, jbyteArray image_list_data)
{
jsize jbyte_image_list_data_len = env->GetArrayLength(image_list_data);
jbyte* jbyte_image_list_data = new jbyte[jbyte_image_list_data_len];
env->GetByteArrayRegion(image_list_data, 0, jbyte_image_list_data_len, jbyte_image_list_data);
// 进行逻辑处理
// do something...
// 释放内存
delete[] jbyte_image_list_data;
return 1;
}
参考链接
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ – Jni中的GetByteArrayElements和GetByteArrayRegion的区别和使用示例
原文链接:https://www.stubbornhuang.com/2032/
发布于:2022年03月14日 16:20:49
修改于:2023年06月26日 20:28:25
当前分类随机文章推荐
- C++11 - 委托机制的实现TinyDelegate 阅读1720次,点赞0次
- C++ - 线程安全的std::cout 阅读2285次,点赞0次
- C++ - 单例模式 阅读83次,点赞0次
- C++11 - 使用std::thread::join()/std::thread::detach()方法需要注意的点 阅读3529次,点赞0次
- GCC - 常用手动链接选项-lz、-lrt、-lm、-lc、-lpthread、-lcrypt、dl链接都是什么库? 阅读64次,点赞0次
- C++ - 在Visual Studio中使用OpenMP加速for循环 阅读501次,点赞0次
- OpenCV - OpenCV打开摄像头显示摄像头帧率 阅读311次,点赞0次
- C++ - 只有在Debug模式下才使用std::cout输出调试日志,Release发布版本不输出调试日志 阅读5062次,点赞0次
- C++ - websocket++不依赖boost,基于独立Asio编译方法 阅读122次,点赞0次
- C++ - 使用Spout2将视频流发送到OBS 阅读219次,点赞0次
全站随机文章推荐
- C++11 - 使用std::chrono计算程序、函数运行时间 阅读3070次,点赞0次
- Ubuntu编译安装FFmpeg+libx264以及编译+安装Opencv+FFmpeg保姆教程 阅读3669次,点赞1次
- WordPress - 网站性能优化,延迟加载css和js文件 阅读149次,点赞0次
- PlaySound 播放内存中的音频数据 阅读3363次,点赞0次
- 深度学习 - 为什么要初始化网络模型权重? 阅读678次,点赞0次
- Github - Github最简单的下载仓库中单个文件的方法 阅读1174次,点赞0次
- 资源分享 - Game Physics (First Edition) 英文高清PDF下载 阅读1803次,点赞0次
- C++ - return this和return *this的含义和区别 阅读652次,点赞0次
- 资源分享 - Tricks of the 3D Game Programming Gurus - Advanced 3D Graphics and Rasterization 英文高清PDF下载 阅读1858次,点赞0次
- 资源分享 - A Biography of the Pixel 英文高清PDF下载 阅读2589次,点赞0次
评论
169