C++ – Jni中的GetByteArrayElements和GetByteArrayRegion的区别和使用示例
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ – Jni中的GetByteArrayElements和GetByteArrayRegion的区别和使用示例
原文链接:https://www.stubbornhuang.com/2032/
发布于:2022年03月14日 16:20:49
修改于:2022年03月14日 16:23:48

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;
}
参考链接
当前分类随机文章推荐
- C++ - Windows/Linux跨平台获取本机CPU核心数 阅读101次,点赞0次
- C++ - C++类的特殊成员函数,析构函数,拷贝构造函数,移动构造函数,赋值运算符,移动赋值运算符介绍和基础语法 阅读758次,点赞0次
- C++11 - 使用std::thread::join()/std::thread::detach()方法需要注意的点 阅读2699次,点赞0次
- C++ - 获取当前进程内存使用情况 阅读8345次,点赞10次
- C++ - vector存储动态指针时正确释放内存 阅读5579次,点赞0次
- C++STL容器 - std::vector元素访问方式总结 阅读767次,点赞0次
- C++11 - 构建一个符合实际应用要求的线程池 阅读1040次,点赞0次
- C++ – 字节数组byte[]或者unsigned char[]与short的相互转换 阅读1230次,点赞0次
- C++11 - std::chrono - 使用std::chrono::duration_cast进行时间转换,hours/minutes/seconds/milliseconds/microseconds相互转换,以及自定义duration进行转换 阅读2082次,点赞0次
- C++11/std::shared_ptr - 循环引用问题 阅读4000次,点赞0次
全站随机文章推荐
- Pytorch - RuntimeError: No rendezvous handler for env://错误 阅读803次,点赞0次
- 资源分享 - Ray Tracing Gems II - Next Generation Real-Time Rendering with DXR, Vulkan, and OptiX-Apress 英文高清PDF下载 阅读1867次,点赞0次
- Python - 普通函数/lambda匿名函数/类成员函数作为回调函数的用法 阅读1925次,点赞0次
- C++11 - 使用std::thread,std::shared_future,std::promise并行化/多线程化for循环,提升处理速度 阅读1377次,点赞0次
- WordPress - get_header函数,加载主题头部header模板 阅读867次,点赞0次
- C++ - 字节数组byte[]或者unsigned char[]与long的相互转换 阅读796次,点赞0次
- 资源分享 - 8i Voxelized Full Bodies – A Voxelized Point Cloud Dataset下载 阅读2527次,点赞0次
- 资源分享 - Handbook of Digital Image Synthesis - Scientific Foundations of Rendering 英文高清PDF下载 阅读1192次,点赞0次
- 网站个性化 - 添加人形时钟 honehone_clock.js 阅读2932次,点赞0次
- WordPress - 限制非管理员用户进入WordPress后台页面,重定向到首页 阅读915次,点赞0次
评论
167