大家应该会遇到类似的需求,从Camera端拿到实时的YUV数据,然后需要送给三方的算法进行处理。这个时候,在app端,我们一般会采用JNI的方式,将Camera数据送给算法处理。
当然,还会有其它的类似使用场景。
今天就来贴下,通过JNI传递byte[]数据的2种方式,大家觉的有用,可以进行收藏。
第一种方式:
进行内存数据拷贝,jni返回处理后的byte[]。
------ native 层实现
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_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 JNICALL
Java_com_***_native_process(JNIEnv *env, jobject thiz,jobject data) {
unsigned char* buf = (unsigned char*)(*env).GetDirectBufferAddress(data);
//process buf,在这个地方对buf进行处理.
}
《Android Camera开发入门》、《Camx初认识》已经上架,可以点击了解 -> 小驰成长圈 |期待见证彼此的成长
觉得不错,点个赞呗