Java本机接口-在Java中使用第三方dll文件

Java本机接口-在Java中使用第三方dll文件,java,c,dll,java-native-interface,native,Java,C,Dll,Java Native Interface,Native,编辑问题: 正在尝试使用JNA从Java使用.dll文件。我设法做到了: 将.dll添加到系统库-System.loadLibrary(“NativeLibrary”) 已创建NativeInterface以映射.dll/.h文件中的函数: public interface NativeInterface extends Library, StdCallLibrary { public int methodA(packageURL.NativeInterface.typeDefN

编辑问题:

正在尝试使用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中的名称是“mangled”-使用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);
                }
            }
        );
以及:


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

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

但是我建议先学习C或C++编程,特别是指针类(如你需要的)。
创建DLL文件的方式取决于所使用的编译器,前面的书中对某些编译器进行了描述…

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


当你点击链接时,一定要向下滚动--有很多文档和资料,但是页面顶部被文件列表占据,所以在你向下滚动之前,它看起来不是很有用。

使用此功能,你可以更接近它,我现在得到:java.lang.UnsatifiedLinkError:Error使用Dependency Walker查找函数methodA时出错函数名将更改为:?methodA@@@YAHPAEIPAPAXFPAU@@@Z环顾四周,看起来我需要将此映射/当它看到methodA时更改函数名为?methodA@@@YAHPAEIPAPAXFPAU@@@Z。有什么建议吗?啊。是的,JNA并没有真正处理C++的名字。用于第三方跨语言重用的DLL通常不包含它们,但遗憾的是,您的DLL显然包含它们。你可以看到BridJ(),它并不是那么成熟,而是试图支持比JNA更好的C++。实际上,另一种选择是使用SWIG()生成Java包装器。SWIG是一个伟大的产品,但是你确实需要编译生成的本地代码并将其链接到库中,所以它不容易被用作JNA——但是你不必自己编写任何C++代码。通过创建函数映射器,只需将GETMultNeX改成DLL中实际调用的函数,就可以进一步做。它不喜欢我传递给函数的参数之一。它在.h文件typedef中定义…设法将所有内容映射到我需要的方法。只需要玩弄这些价值观,我就会拥有它。谢谢:)
class Mapper implements FunctionMapper{
    public String getFunctionName(NativeLibrary library, Method method) {
       return "?" + method.getName() + "@@YAHPAEIPAPAXFPAUtypeDefName@@@Z";
    }

}