Java JNI和省略号混乱

时间:2011-07-01 03:28:01

标签: java sql c java-native-interface ellipsis

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

我需要从Java调用此函数并使用JNI。我不确定最好的方法是什么,特别是Java更严格的打字。我已经考虑了一些解决方案,但它们似乎没有任何好处/我不确定如何实现它们:将所有内容作为字符串传递,传递jobjectArray或一次传递一个单元格值。

非常感谢任何帮助。

谢谢,

2 个答案:

答案 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的包装器。如果需要的话。