我使用Android从Java访问一个C函数。C函数接受一个数组并返回三个数组作为参数。
大多数文档和示例展示了如何通过函数返回值返回jarray,从而使用SetIntArrayRegion()或类似的方法返回一个数组对象。这说明了一个数组,如何返回其余的数组?有没有一种通过函数参数返回它们的方法?我试过了,但到目前为止没有成功。
请提供一个JNI函数的快速示例,它可以这样做,或者向我指出一个适当的文档。我将非常感激。
谢谢。
发布于 2015-05-11 07:29:49
当您希望从一个函数返回多个“东西”时,您有两个选项(这并不是JNI特有的):要么创建一个包含所有结果的包装器对象(在您的例子中,是一个包含3个数组字段的Java类),要么使用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]));
}
}
https://stackoverflow.com/questions/30158750
复制相似问题