代码之家  ›  专栏  ›  技术社区  ›  dyslexit

如何将Java null参数传递给使用JNA编译为C代码的本机方法?

  •  1
  • dyslexit  · 技术社区  · 8 年前

    我想用 Java library 包装C库 libudev . 我需要调用的方法之一, addMatchSubsystemDevtype(final String subsystem, final String devtype) ,接受两个字符串参数,其中第二个参数需要是 null . 可以看到C代码中的一个示例 here (ctrl+f null)。然而,当我尝试在Java中这样做时,JNA抛出 NullPointerException ,如图所示:

    Monitor monitor = Monitor.newFromNetlink(udev, "udev");
    monitor.addMatchSubsystemDevtype("video4linux", null);
    

    例外情况:

    Exception in thread "main" java.lang.NullPointerException
        at com.sun.jna.Native.getBytes(Native.java:604)
        at com.sun.jna.Native.toByteArray(Native.java:627)
        at com.sun.jna.Native.toByteArray(Native.java:620)
        at org.freedesktop.libudev.jna.StringUtil.asPointer(StringUtil.java:14)
        at org.freedesktop.libudev.Monitor.addMatchSubsystemDevtype(Monitor.java:116)
        at Example.main(Example.java:14)
    

    有没有办法从Java向这个C方法传递null?

    1 回复  |  直到 8 年前
        1
  •  1
  •   dyslexit    8 年前

    @user2543253指出,这不是JNA问题,而是Java库的问题。我通过简单地添加

    public int addMatchSubsystem(final String subsystem) {
        return UdevLibrary.INSTANCE().udev_monitor_filter_add_match_subsystem_devtype(
                getPointer(), StringUtil.asPointer(subsystem), null);
    }
    

    到图书馆的监视器类。