【问题标题】:Java Native Interface - Using a third party dll file in javaJava Native Interface - 在 java 中使用第三方 dll 文件
【发布时间】:2012-01-31 11:30:07
【问题描述】:

已编辑问题:

尝试通过 JNA 使用来自 Java 的 .dll 文件。我设法:

将 .dll 添加到系统库 - System.loadLibrary("NativeLibrary");

创建了一个 NativeInterface 来映射 .dll/.h 文件中的函数:

public interface NativeInterface extends Library, StdCallLibrary {
        public int methodA(packageURL.NativeInterface.typeDefName n);
        public int methodB();

        public static class typeDefName implements Structure.ByReference{

            public typeDefName(short s) {}  
    }
}

将映射添加到我的函数名称,因为它在 .dll 中的名称是“损坏的” - 使用 Dependency Walker 发现了这一点

        Map options = new HashMap();
    options.
        put(
            Library.OPTION_FUNCTION_MAPPER, 
            new Mapper() {
                public String getFunctionName(NativeLibrary library, Method method) {
                    return super.getFunctionName(library, method);
                }
            }
        );

与:

class Mapper implements FunctionMapper{
    public String getFunctionName(NativeLibrary library, Method method) {
       return "?" + method.getName() + "@@YAHPAEIPAPAXFPAUtypeDefName@@@Z";
    }

}

现在(我不确定)是如何创建 typeDefName 的对象以传递给方法 A

【问题讨论】:

    标签: java c dll java-native-interface native


    【解决方案1】:

    如果您的目标只是使用 Java 中的现有 DLL,您可以使用 JNA 根本不做任何本机编程。 JNA 动态访问第三方共享库的方法。您可以直接使用该库或使用 JNA 完全用 Java 编写一个方便的包装器。

    当您单击链接时,请务必向下滚动 - 有很多文档和资料,但页面顶部被文件列表占用,因此在您向下滚动之前它看起来并不是很有用。

    【讨论】:

    • 越来越近地使用它,我现在得到:java.lang.UnsatisfiedLinkError: Error looking up function methodA 使用 Dependency Walker 函数名称被更改为:?methodA@@YAHPAEIPAPAXFPAU@@@Z环顾四周,当它看到 methodA 到 ?methodA@@YAHPAEIPAPAXFPAU@@@Z 时,我需要将其映射/更改函数名称。有什么建议吗?
    • 呃。是的,JNA 并没有真正处理 C++ 损坏的名称。用于第三方跨语言重用的 DLL 通常不包含它们,但遗憾的是您的显然包含它们。你可以看看 BridJ (code.google.com/p/bridj),它还没有那么成熟,但尝试比 JNA 更好地支持 C++。实际上,另一种选择是使用 SWIG (swig.org) 生成 Java 包装器。 SWIG 是一款很棒的产品,但是您确实需要编译生成的本机代码并将其链接到库中,因此它不像 JNA 那样易于使用——但您不必自己编写任何 C++ 代码。
    • 通过创建FunctionMapper 更进一步,只需将getMethodName 更改为.dll 中实际调用的函数。它不喜欢我传递给函数的参数之一。它在 .h 文件 typedef 中定义...
    • 设法将所有内容映射到我需要的方法。只需要玩弄这些价值观,我就会拥有它。谢谢:)
    【解决方案2】:

    您可以找到一本关于 JNI here 的书,其中还包含一些代码示例。

    但我建议先学习 C 或 C++ 编程,尤其是指针的东西(因为你会需要它)。

    您创建 DLL 文件的方式取决于您使用的编译器,在上述书籍中对此进行了描述...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2015-02-26
      相关资源
      最近更新 更多