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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
52