我有一个要在 Android 应用程序中使用的 C 函数,该函数“返回”多个短 (int) 指针以及每个指针通过参数列表指向的短整数的数量。我想将所有这些列表返回给调用 Java 类,因此不能对函数使用单一返回类型。看来我需要事先知道列表的大小,以便预先分配具有足够内存的 java Short[] ,如下所示:
java类内部
short[] fooArr = new short[2];
short[] mooArr = FibLib.testFunc(fooArr);
c 文件内
JNIEXPORT jshortArray JNICALL Java_com_funTest_testFunc(JNIEnv *env, jclass clazz, jshortArray retData) {
// retData is the data returned to the caller via the parameter list
// it is declared in the java section and a pointer is created here
jshort outCArray[] = {100, 200}; // some fake data; in reality the size of this list is unknown until runtime
jshort *cArray = (*env)->GetShortArrayElements(env, retData, NULL);
if (cArray == NULL)
{
return 0;
}
else
{
//jini len = (*env)->GetArrayLength(env, array);
jsize len = (*env)->GetArrayLength(env, retData);
jint ix;
for (ix = 0; ix < len; ix++) {
cArray[ix] = outCArray[ix]; // this will modify retData with the new values when we release
}
(*env)->ReleaseShortArrayElements(env, retData, cArray, 0); // mode 0 to copy back the content and free cArray
}
jshortArray outJNIArray = (*env)->NewShortArray(env, 2); // allocate
//if (NULL == outJNIArray) return -1;
(*env)->SetShortArrayRegion(env, outJNIArray, 0 , 2, outCArray); // copy
return outJNIArray;
}
如果我事先不知道 retData 的大小,如何将“可调整大小”的 fooArr 传递给 testFunc?
最佳答案
为什么不呢?使用 JNI 的关键是以自然的方式定义 Java 模型(类和公共(public)成员)。一些公共(public)成员可以在 JNI 中本地化和实现,但创建私有(private)本地方法和辅助方法通常更容易,因此 JNI 编码对于 C 来说更干净、更自然。so can't use a single return type for the function.
如果将 com.funTest.testFunc 作为工厂方法有意义,则创建其自身的实例,向类中添加一些实例字段以获取结果,然后在 JNI 中创建一个实例并填充其字段。
或者,如果您想要一个单独的结果类,请定义一个结果类并在 JNI 端创建它并返回它。
这完全取决于最有效的 Java 模型。
关于java - 将 JNI 与返回多个大小未预先确定的短 int 指针的 C 函数结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25819907/