java - JNA:仅更改一个外部 native 库的字符串编码

标签 java encoding character-encoding jna

我们这里有一个加载和使用大量外部库的 JAVA 应用程序。操作系统 (Windows) 的默认编码是“windows-1252”(或“cp-1252”)。但是有一个外部库需要“utf-8”中的所有字符串(传入和传出)。我怎样才能做到这一点?如何仅更改一个 JNA 库的字符串编码类型?

最佳答案

正常的 JNA 模式是这样的:

public interface DemoLibrary extends Library {

    DemoLibrary INSTANCE = Native.load("demoLibrary", DemoLibrary.class);

    // abstract method declarations as interface to native library
}

但是,Native#load 被多次重载以支持自定义绑定(bind)。相关的重载是:Native#load(String, Class, Map<String,?>) .第三个参数可用于将选项传递给 native 库加载程序。这些选项可以在 com.sun.jna.Library 中找到接口(interface)。

此处的相关选项是 Library.OPTION_STRING_ENCODING。该选项将传递给加载的 NativeLibrary 实例,并将用作此类的默认编码。

上面的例子就变成了

public interface DemoLibrary extends Library {

    DemoLibrary INSTANCE = Native.load("demoLibrary", DemoLibrary.class,
        Collections.singletonMap(Library.OPTION_STRING_ENCODING, "UTF-8"));

}

如果您需要自定义更多(类型映射器、调用约定),则需要在静态初始化 block 中创建选项映射。

关于java - JNA:仅更改一个外部 native 库的字符串编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62875199/

相关文章:

php - 在 PHP 中检测文件编码

java - Android TextView 显示音标(IPA)符号?

html - 在 HTML 中声明字符编码

java - 匿名类实现接口(interface),不能有参数

javascript - 在javascript中将对话UTF-8编码为1251

multithreading - 在 SLURM 环境中运行 FFMPEG 多线程

python - 在Python中显示西里尔字母

java - 带有列表 java 8 的流式列表的最小日期

java - LIUM 演讲者分类如何运作?

java - 从泛型 T 派生类