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

我想将摄像头捕获的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

点赞