Android和JNI如何将Byte []数据数组传递到JNI并获取返回的Byte []

4
我希望将由相机捕获的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
Byte[] 还是 byte[]?如果是前者,为什么?为什么不使用 byte 数组? - user207421
抱歉,应该是byte[],但我想将其视为数据并将其存储在另一个数组中。 - Aaron
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]));
}

请查看此处,以获取更多详细信息: 这里

谢谢您的回答。然而,我对您的代码感到困惑,您能否给一些解释呢? - Aaron
由于我不知道您的代码与将byte[][]传递给JNI并获取byte[]返回的方式之间的关系,因此无法提供更多帮助。 - Aaron
1
http://developer.android.com/training/articles/perf-jni.html#region_calls - Imran
非常感谢,我觉得我需要花更多的时间来学习它。 - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接