大家应该会遇到类似的需求,从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初认识》已经上架,可以点击了解 -> 小驰成长圈 |期待见证彼此的成长
觉得不错,点个赞呗 
评论 (0)