У меня есть интерфейс JNA Java для функции C 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
(именно то, что я делаю вручную), но я получаю разные результаты.
Кто-нибудь может пролить свет на это?