我有一个 C 函数的 JNA Java 接口,mpv_set_option_string
定义为:
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 应该String
默认编码为char *
UTF-8 编码并NUL
终止(正是我手动执行的操作),但我得到了不同的结果。
任何人都可以对此有所了解吗?