带有字符串的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 楼答案
您不应该将W32选项传递给不是WIN32 API的库
默认情况下,JNA将
String
映射到char*
,因此删除这些选项应该可以解决这个问题您还应该为句柄使用显式本机类型,而不是Java}可能是正确的
long
^在这种情况下,{