Camera 应用开发

Android 通过JNI 传递byte[] 、buffer 的2种方式 | 亲测代码

大家应该会遇到类似的需求,从Camera端拿到实时的YUV数据,然后需要送给三方的算法进行处理。这个时候,在app端,我们一般会采用JNI的方式,将Camera数据送给算法处理。

当然,还会有其它的类似使用场景。

今天就来贴下,通过JNI传递byte[]数据的2种方式,大家觉的有用,可以进行收藏。

第一种方式:

进行内存数据拷贝,jni返回处理后的byte[]。

------ native 层实现
extern "C"JNIEXPORT jbyteArray JNICALLJava_com_***_native_process(JNIEnv *env, jobject thiz,jbyteArray data) {
int len = env->GetArrayLength (data); unsigned char* buf = new unsigned char[len]; env->GetByteArrayRegion(data, 0, len, reinterpret_cast<jbyte*>(buf));
//在这个地方处理byte[] 数据,比如送给算法处理 dul_buffer(buf); jbyteArray byteArray = env->NewByteArray(len); jbyte *byteArrayElements = env->GetByteArrayElements(byteArray, NULL); //拷贝处理后的buf数据并返回java层 byte[] memcpy(byteArrayElements, buf, len); delete[] buf; env->ReleaseByteArrayElements(byteArray, byteArrayElements, 0); return byteArray;}
第二种方式:

采用 ByteBuffer.allocateDirect、GetDirectBufferAddress,jni 直接访问内存地址。

---- java层代码
private ByteBuffer buffer;
if (buffer == null) { buffer = ByteBuffer.allocateDirect(data.length);}buffer.clear();buffer.put(data);
process(buffer)
------ jni native 方法public native byte[] native_process(ByteBuffer buffer);
extern "C"JNIEXPORT jbyteArray JNICALLJava_com_***_native_process(JNIEnv *env, jobject thiz,jobject data) {
unsigned char* buf = (unsigned char*)(*env).GetDirectBufferAddress(data); //process buf,在这个地方对buf进行处理. }

《Android Camera开发入门》、《Camx初认识》已经上架,可以点击了解 -> 小驰成长圈 |期待见证彼此的成长 

觉得不错,点个赞呗 

欢迎扫码关注「小驰行动派」公众号 10 年Camera开发 | Camera技术干货 | 行业洞察 | Camera实战分享
小驰行动派公众号 扫一扫关注
分享到: 复制链接
← 上一篇 一份非常牛逼的计算机相关技术资料整理 下一篇 → Camera基础及一些基本概念

相关文章

推荐课程

想系统学习 Camera 开发?看看这些课程

评论 (0)

暂无评论,快来抢沙发吧