如何从JNI返回多个数组到Java?

时间:2015-05-11 02:17:05

标签: android-ndk

我正在使用Android NDK从Java访问C函数。 C函数接受一个数组并返回三个数组作为其参数。

大多数文档和示例显示如何通过函数返回值返回jarray,使用SetIntArrayRegion()或类似方法返回一个数组对象。这占了一个数组,如何返回剩余的数组?有没有办法通过函数参数返回它们?我试过但到目前为止没有成功。

请提供JNI函数的快速示例,该函数可以执行此操作或指向适当的文档。我非常感激。

谢谢。

1 个答案:

答案 0 :(得分:1)

当你想从一个函数返回多个“东西”时,你有两个选择(这不是特定于JNI):要么创建一个包含所有结果的包装器对象(在你的情况下,是一个Java类,有3个数组字段),或使用 out 参数。如果你知道电话会议之前的长度,那么在你的情况下,后者可能会更容易。

所以,在Java中,你写了类似

的东西
package p;

public class C {

    public void f() {

        byte[] array1 = new byte[10];
        int[] array2 = new int[20];
        String[] array3 = new String[5];

        fillArrays(array1, array2, array3);
    }
    native void fillArrays(byte[] byteArray, int[] intArray, String[] stringArray);
}

现在,在C中,这看起来像这样:

JNIEXPORT void JNICALL 
Java_p_C_fillArrays(JNIEnv *env, jobject thisC, jbyteArray byteArray, jintArray intArray, jobjectArray stringArray)
{
    jboolean isCopy;
    jint i = 0;
    char* names[] = {"one", "two", "three"};

    jbyte *c_byteArray = (*env)->GetByteArrayElements(env, byteArray, &isCopy);
    for (i=0; i<(*env)->GetArrayLength(env, byteArray); i++) {
        c_byteArray[i] = (jbyte)i;
    }
    (*env)->ReleaseByteArrayElements(env, byteArray, c_byteArray, 0);

    jint *c_intArray = (*env)->GetIntArrayElements(env, intArray, &isCopy);
    for (i=0; i<(*env)->GetArrayLength(env, intArray); i++) {
        c_intArray[i] = i;
    }
    (*env)->ReleaseIntArrayElements(env, intArray, c_intArray, 0);

    for (i=0; i<(*env)->GetArrayLength(env, stringArray) && i<sizeof(names)/sizeof(names[0]); i++) {
        (*env)->SetObjectArrayElement(env, stringArray, i, (*env)->NewStringUTF(env, names[i]));
    }
}