我想将摄像头捕获的byte []数据(帧)传递给JNI部分。我需要一些帧一次传递,所以我在想是否可以创建一个byte [] []来存储byte [],这样我就可以从JNI获取byte []了。可能吗?我知道getByteArrayElement()
可能有所帮助。有谁知道如何实现它?
实际上,我曾尝试使用队列来实现之前传递byte []的目的,但是有些人回答我似乎无法做到这一点。
过去的代码(把byte []放到arraylist中):
aCamera.setPreviewCallback(new PreviewCallback(){
public void onPreviewFrame(byte[] data, Camera camera) {
synchronized (TestClass.this){
AFrame = data;
int i = 0;
queue = new ArrayList<byte[]>(definedSize);
if(queue.size()<definedSize){
queue.add(data);
}
else{
queue.remove(0);
}
TestClass.this.notify();
}
}
});
Arraylist无法回到JNI,所以这次我在想是否可以使用另一个字节数组。
我对使用原生方法的Android应用程序开发非常新。有人能给我一些建议吗?我只是想知道这是否是一种可能的方法。
答案 0 :(得分:2)
JNI是Java Native Interface。它为托管代码(用Java编程语言编写)定义了一种与本机代码交互的方式(用C / C ++编写)。它是供应商中立的,支持从动态共享库加载代码,虽然有时很麻烦,但效率却相当高。
我认为以下代码可以帮助您::
void Java_MyClass_Solution(JNIEnv* env, jobject, jobject input, jobjectArray output)
{
jsize nThumbnails = env->GetArrayLength(output) - 1;
void* inputPtr = env->GetDirectBufferAddress(input);
jlong inputLength = env->GetDirectBufferCapacity(input);
// ...
void* hash = ...; // a pointer to the hash data
int hashDataLength = ...;
void** thumbnails = ...; // an array of pointers, each one points to thumbnail data
int* thumbnailDataLengths = ...; // an array of ints, each one is the length of the thumbnail data with the same index
jobject hashBuffer = env->NewDirectByteBuffer(hash, hashDataLength);
env->SetObjectArrayElement(output, 0, hashBuffer);
for (int i = 0; i < nThumbnails; i++)
env->SetObjectArrayElement(output, i + 1, env->NewDirectByteBuffer(thumbnails[i], thumbnailDataLengths[i]));
}
请详细了解here