有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有字符串的java JNA调用与带有字节[]的java JNA调用的行为不同

我有一个用于C函数mpv_set_option_string的JNA Java接口,定义如下:

public interface MPV extends StdCallLibrary {
    MPV INSTANCE = Native.loadLibrary("lib/mpv-1.dll", MPV.class, W32APIOptions.DEFAULT_OPTIONS);

    long mpv_create();
    int mpv_initialize(long handle);
    int mpv_set_option_string(long handle, String name, String data);
}

当我这样称呼它:

System.setProperty("jna.encoding", "UTF8");

long handle = MPV.INSTANCE.mpv_create();
int error = MPV.INSTANCE.mpv_initialize(handle);
error = MPV.INSTANCE.mpv_set_option_string(handle, "keep-open", "always");

我从上次调用中得到一个错误(-5),表明没有找到选项(keep-open

但是,如果我将JNA函数签名更改为:

int mpv_set_option_string(long handle, byte[] name, byte[] data);

。。。然后这样称呼它:

error = MPV.INSTANCE.mpv_set_option_string(
    handle, 
    "keep-open\0".getBytes(StandardCharsets.UTF_8),
    "always\0".getBytes(StandardCharsets.UTF_8)
);

。。。它不返回错误(0),并且工作正常(或者看起来是这样)

我没有得到的是,JNA应该在默认情况下用UTF-8编码将String编码为char *,并以NUL终止(这正是我手动完成的),但我得到了不同的结果

有人能解释一下吗


共 (1) 个答案

  1. # 1 楼答案

    您不应该将W32选项传递给不是WIN32 API的库

    默认情况下,JNA将String映射到char*,因此删除这些选项应该可以解决这个问题

    您还应该为句柄使用显式本机类型,而不是Java long^在这种情况下,{}可能是正确的