gpt4 book ai didi

Java JNI 和省略号困惑

转载 作者:行者123 更新时间:2023-12-04 06:21:10 28 4
gpt4 key购买 nike

我在 c 中有一个函数,可以向表中添加一行。该函数通过使用省略号 add_row(int arg1, int arg2, ...) 将整数、浮点数和字符串的各种排序作为参数。并根据列的设置方式解析此信息。

我需要从 Java 调用这个函数并且正在使用 JNI。我不确定这样做的最佳方法是什么,尤其是对于 Java 更严格的类型。我已经考虑了一些解决方案,但它们似乎都没有任何好处/我不确定如何实现它们:将所有内容作为字符串传递,传递一个 jobjectArray,或一次传递一个单元格值。

任何帮助深表感谢。

谢谢,

最佳答案

这不是 Java 和 JNI 的问题,而是如何使用动态参数列表在 C 中调用 var args 函数的问题。
Calling a C function with a varargs argument dynamically这表明有两个版本的 var args 函数(虽然我认为约定更多的是允许传递现有的 va_list ,而不是构造一个(这似乎相当复杂))。

JNI 位应该只是定义一个带有对象数组参数的 Java native 方法,该方法将具有接收数组的 C 等效项。使用 JNI API 将值转换为 C 等效项(整数和 ANSI 字符串),然后将它们加载到 var args 结构中并调用您的 vadd_row()功能。

java :

package mypackage;
public class MyClass {
...
public native void addRow(Object[] args);
...
}

C:
void vadd_row(int arg1, int arg2, va_list argp) {
... your function ...
}

void add_row(int arg1, int arg2, ...) {
va_list argp;

va_start(argp, arg2);
vadd_row(int arg1, int arg2, argp);
va_end(argp);
}


JNIEXPORT void JNICALL mypackage_MyClass_addRow(JNIEnv *env, jobject this, jint arg1, jint arg2, jobjectArray jarg_array) {
va_list argp;
/* need to construct argp, see link below for hints[1]; go through each element
of the java array, get the object; convert to primitive value or ANSI string,
then encode it into the va_list */
vadd_row((int)arg1, (int)arg2, argp);
}

[1] https://bbs.archlinux.org/viewtopic.php?pid=238721

值得麻烦吗?

考虑只编写一个更简单的 C 函数来接收数组中的参数,然后根据需要创建一个使用 var args 的包装器。

关于Java JNI 和省略号困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6543283/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com