这不是 Java 和 JNI 的问题,而是如何在 C 中使用动态参数列表调用 var args 函数的问题。
请参阅Calling a C function with a varargs argument dynamically,它建议有两个版本的 var args 函数(尽管我认为约定更多是允许通过现有的va_list,而不是构造一个(这似乎相当复杂))。
JNI 位应该只是定义一个带有对象数组参数的 Java 本机方法,该方法将有一个 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 的包装器。