gpt4 book ai didi

java - 使用 String 的 JNA 调用与使用 byte[] 的 JNA 调用的行为不同

转载 作者:行者123 更新时间:2023-11-30 01:49:23 26 4
gpt4 key购买 nike

我有一个用于 C 函数 mpv_set_option_string 的 JNA Java 接口(interface),定义为:

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 编码和 NUL 默认将 String 编码为 char *终止(正是我手动执行的操作),但我得到了不同的结果。

有谁能解释一下吗?

最佳答案

您不应该将 W32OPTIONS 传递给不是 WIN32 API 的库。

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

您还应该为句柄使用显式 native 类型,而不是 Java long。在这种情况下,Pointer 可能是正确的。

关于java - 使用 String 的 JNA 调用与使用 byte[] 的 JNA 调用的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56606279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com