我在c中有一个向表添加行的函数。该函数使用省略号add_row(int arg1, int arg2, ...)
作为参数的各种ints,浮点数和字符串顺序,并根据列的设置方式解析此信息。
我需要从Java调用此函数并使用JNI。我不确定最好的方法是什么,特别是Java更严格的打字。我已经考虑了一些解决方案,但它们似乎没有任何好处/我不确定如何实现它们:将所有内容作为字符串传递,传递jobjectArray或一次传递一个单元格值。
非常感谢任何帮助。
谢谢,
本
答案 0 :(得分:2)
Java方面很简单。将本机方法定义为(Object ... args)。然后你将在调用站点获得自动装箱,并且在JNI方法中你将得到一个对象数组,其元素可以是String,Integer,Double等,你可以用GetObjectClass检查并做相应的事情。
然而然后你会遇到一个主要问题,构建对C中方法的实际调用,我不知道你将如何解决这个问题。
答案 1 :(得分:1)
这不是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()
函数。
爪哇:
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的包装器。如果需要的话。