【问题标题】:Java JNI and ellipsis messJava JNI 和省略号混乱
【发布时间】:2011-09-26 11:05:51
【问题描述】:

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

我需要从 Java 调用这个函数并且我正在使用 JNI。我不确定最好的方法是使用 Java 更严格的类型。我考虑了一些解决方案,但似乎没有一个好/我不确定如何实现它们:将所有内容作为字符串传递、传递一个 jobjectArray 或一次传递一个单元格值。

非常感谢任何帮助。

谢谢,

【问题讨论】:

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


    【解决方案1】:

    Java 方面很简单。将本机方法定义为 (Object...args)。然后,您将在调用站点获得自动装箱,在 JNI 方法中,您将获得一个对象数组,其元素可能是 String、Integer、Double 等,您可以使用 GetObjectClass 检查并执行相应的操作。

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

    【讨论】:

      【解决方案2】:

      这不是 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 的包装器。

      【讨论】:

        猜你喜欢
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-26
        相关资源
        最近更新 更多