首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从JNI返回多个数组到Java?

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

Stack Overflow用户
提问于 2015-05-11 02:17:04
回答 1查看 1.1K关注 0票数 1

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

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

请提供一个JNI函数的快速示例,它可以这样做,或者向我指出一个适当的文档。我将非常感激。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-05-11 07:29:49

当您希望从一个函数返回多个“东西”时,您有两个选项(这并不是JNI特有的):要么创建一个包含所有结果的包装器对象(在您的例子中,是一个包含3个数组字段的Java类),要么使用out参数。也许,在您的情况下,如果您知道调用前的长度,后者可能会更容易一些。

所以,在Java中,您可以编写如下内容

代码语言:javascript
复制
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中,这看起来是这样的:

代码语言:javascript
复制
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]));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30158750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档