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

文摘   2024-11-02 07:30   广东  

大家应该会遇到类似的需求,从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初认识》已经上架,可以点击了解 -> 小驰成长圈 |期待见证彼此的成长 



觉得不错,点个赞呗 


小驰行动派
前世界500强软件开发工程师,记录分享工作和生活的思考。感谢关注,期待见证彼此的成长~
 最新文章