4

我想将相机捕获的字节 [] 数据(帧)传递给 JNI 部分。我需要一次通过一些帧,所以我在考虑是否可以创建一个 byte[][] 来存储 byte[] 以便我可以从 JNI 取回 byte[]。可能吗?我知道这getByteArrayElement()可能会有所帮助。有谁知道如何实现它?

其实我之前也试过用queue来达到传递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 应用程序开发非常陌生。谁能给我一些建议?我只想知道这是否是一种可能的方法。

4

1 回答 1

2

JNI 是 Java 本地接口。它定义了一种托管代码(用 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]));
}

请在此处了解更多详细信息

于 2013-10-28T07:12:29.913 回答