我想将摄像头捕获的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应用程序开发与本机方法.有人能给我一些建议吗?我只是想知道这是否是一种可行的方法.
最佳答案 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