Android& JNI如何将Byte []数据数组传递给JNI并返回Byte []

时间:2013-10-28 06:04:26

标签: java android c++ java-native-interface

我想将摄像头捕获的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应用程序开发非常新。有人能给我一些建议吗?我只是想知道这是否是一种可能的方法。

1 个答案:

答案 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