我在 c 中有一个函数,可以向表中添加一行。该函数通过使用省略号将整数、浮点数和字符串的各种排序作为参数,并add_row(int arg1, int arg2, ...)
根据列的设置方式解析此信息。
我需要从 Java 调用这个函数并且正在使用 JNI。我不确定最好的方法是使用 Java 更严格的类型。我考虑了一些解决方案,但似乎没有一个好/我不确定如何实现它们:将所有内容作为字符串传递,传递一个 jobjectArray,或一次传递一个单元格值。
任何帮助深表感谢。
谢谢,
本
我在 c 中有一个函数,可以向表中添加一行。该函数通过使用省略号将整数、浮点数和字符串的各种排序作为参数,并add_row(int arg1, int arg2, ...)
根据列的设置方式解析此信息。
我需要从 Java 调用这个函数并且正在使用 JNI。我不确定最好的方法是使用 Java 更严格的类型。我考虑了一些解决方案,但似乎没有一个好/我不确定如何实现它们:将所有内容作为字符串传递,传递一个 jobjectArray,或一次传递一个单元格值。
任何帮助深表感谢。
谢谢,
本
Java 方面很简单。将本机方法定义为 (Object...args)。然后,您将在调用站点获得自动装箱,在 JNI 方法中,您将获得一个对象数组,其元素可能是 String、Integer、Double 等,您可以使用 GetObjectClass 检查并执行相应的操作。
但是,您将在 C 中构建对方法的实际调用时遇到一个主要问题,我根本不知道您将如何解决这个问题。
这不是 Java 和 JNI 的问题,而是如何在 C 中使用动态参数列表调用 var args 函数的问题。请参阅Calling a C function with a varargs argument dynamic,这表明有两个版本的 var args 函数(尽管我认为约定更多是允许传递现有的va_list
,而不是构造一个(这似乎很复杂))。
JNI 位应该只是定义一个带有对象数组参数的 Java 本机方法,该方法将具有一个接收数组的 C 等效项。使用 JNI API 将值转换为 C 等效项(整数和 ANSI 字符串),然后将它们加载到 var args 结构中并调用您的vadd_row()
函数。
爪哇:
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 的包装器。