java - 将 JNI 与返回多个大小未预先确定的短 int 指针的 C 函数结合使用

标签 java android c java-native-interface

我有一个要在 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?

最佳答案

so can't use a single return type for the function.

为什么不呢?使用 JNI 的关键是以自然的方式定义 Java 模型(类和公共(public)成员)。一些公共(public)成员可以在 JNI 中本地化和实现,但创建私有(private)本地方法和辅助方法通常更容易,因此 JNI 编码对于 C 来说更干净、更自然。

如果将 com.funTest.testFunc 作为工厂方法有意义,则创建其自身的实例,向类中添加一些实例字段以获取结果,然后在 JNI 中创建一个实例并填充其字段。

或者,如果您想要一个单独的结果类,请定义一个结果类并在 JNI 端创建它并返回它。

这完全取决于最有效的 Java 模型。

关于java - 将 JNI 与返回多个大小未预先确定的短 int 指针的 C 函数结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25819907/

相关文章:

java - 如何在父 fragment Activity 的 viewpager 中的两个列表 fragment 之间进行通信

Android:在 web View 中读取具有 ISO-8859-1 字符编码的文本文件

java - Android - 等待可运行完成

c - Ad-Hoc 构建是否有预处理器标志?

java - 如何轻松地从 SWT Combo 下拉列表中获取数据引用

java - Java多线程UDP套接字编程

c - 有多少种方法可以从 0、1 和 2 生成 n 的数字长度?

c++ - Open Watcom 的优点和缺点

java - 如何在java中为每个请求使用JSON Web Token (JWT)?

java - 尝试使用 Spring Boot 2 启动 Gemfire 脉冲时出现 Jackson Cast 异常