我正在使用Android NDK从Java访问C函数。 C函数接受一个数组并返回三个数组作为其参数。
大多数文档和示例显示如何通过函数返回值返回jarray,使用SetIntArrayRegion()或类似方法返回一个数组对象。这占了一个数组,如何返回剩余的数组?有没有办法通过函数参数返回它们?我试过但到目前为止没有成功。
请提供JNI函数的快速示例,该函数可以执行此操作或指向适当的文档。我非常感激。
谢谢。
答案 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]));
}
}