1

mpv_set_option_string次のように定義されたC関数用の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

これに光を当てることができる人はいますか?

4

2 に答える 2