java - 在接口(interface)中提供不同的方法名称

标签 java shared-libraries jna

我对Java一无所知,但我必须解决这个问题。我正在使用 JNA 并在一个文件中:

public interface JRockey4ND extends Library {

    public short rockey(short func, short[] handle, int[] lp1, int[] lp2, short[] p1, short[] p2, short[] p3, short[] p4, byte[] buffer);
    public short RY_FIND=1;
    public short RY_FIND_NEXT=2;
}

在另一个文件中:

JRockey4ND rockey = (JRockey4ND) Native.loadLibrary(libFileName, JRockey4ND.class);
.
.
retval=rockey.rockey(rockey.RY_FIND,handle[0],lp1,lp2,p1,p2,p3,p4,buffer);

它就像一个魅力。但根据平台的不同,由于 Linux .so 和 Windows .dll 之间导出的符号命名不匹配,我必须使用 Rockey 方法而不是 rockey 。我尝试使用以下命令替换 so 文件中的符号名称: perl -pi -e 's/rockey/Rockey/g' lib.so 但它不起作用(符号 'Rockey' 可以之后就找不到了,尽管进行了替换)。

所以我的问题是,如何以最简单的方式(不是最漂亮的方式)以编程方式解决这个问题。非常感谢!

最佳答案

根据JNA JavaDoc ,您可以提供FunctionMapper作为初始化库时的一个选项,它将方法名称映射到库名称。

FunctionMapper mapper = new FunctionMapper() {
    public String getFunctionName(NativeLibrary library, Method method) {
    if (Platform.isWindows()) {
        if (method.getName().equals("rocket")) {
            return "Rocket";
        }
    }
    return method.getName();

} }; 映射选项 = new HashMap(); options.put(Library.OPTION_FUNCTION_MAPPER, 映射器); Native.loadLibrary("rocket", Rocket.class, options);

关于java - 在接口(interface)中提供不同的方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35725695/

相关文章:

java - java中三角形总是说等边

Java - 创建 JPanel 数组会导致空指针异常

java - 打开并将数据发送到另一个 Android 应用程序

C++ 动态库编译/链接

linux - Linux下共享库加载地址

linux - 清除和重建 ldconfig 缓存?

java - 如何在 JNA 中向 java 数组添加偏移量

java - 使用 GAE Blobstore API 删除 n' 交换文本 block

java - JNA 在个人电脑上的不同行为

java - 如何使用 TypeConverter 通过 JNA 将 C 整数映射到 Java 枚举?