2011-07-01 28 views
2

我有C中的函数,增加了一个行的表。该函数通过使用省略号add_row(int arg1, int arg2, ...)将int,float和strings的各种排序作为参数,并根据列的设置方式解析此信息。Java的JNI和省略号乱

我需要从Java调用这个函数和我使用JNI。我不确定使用Java的更严格的打字方式最好的办法是什么。我已经考虑了一些解决方案,但没有一个看起来好/我不知道如何实现它们:将所有内容作为字符串传递,传递jobjectArray或传递单元值。

任何帮助,非常感谢。

感谢,

回答

1

这是少了与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函数,然后创建如果需要使用变参的包装。

2

Java方面很简单。将本地方法定义为(Object ... args)。然后你会在调用站点自动装箱,并且在JNI方法中,你将得到一个Object的数组,它的元素可以是String,Integer,Double等,你可以用GetObjectClass检查并做适当的事情。

但是然后你会遇到一个重大的问题,构建C中实际调用方法,我不知道你将如何解决这个问题。