这是少了与Java和JNI以及如何调用在C变参函数的参数的动态列表更成问题的问题。 见这表明具有变参函数的两个版本(虽然我觉得惯例是更允许现有va_list
的直通,而不是构建一个(这似乎是相当复杂))Calling a C function with a varargs argument dynamically。
的JNI位应该只是定义与对象数组参数,这将具有C等效接收阵列的Java本机方法。使用JNI API将值转换为C等效值(ints和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函数,然后创建如果需要使用变参的包装。