Java Native Interface - 在java中使用第三方dll文件

时间:2012-01-31 11:30:07

标签: 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.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);
                }
            }
        );

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

}

现在(我不确定)是如何创建一个typeDefName的Object来传递给方法A

2 个答案:

答案 0 :(得分:2)

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

单击链接时,请务必向下滚动 - 有大量文档和内容,但页面顶部是由文件列表消耗的,所以在向下滚动之前它看起来不太有用。

答案 1 :(得分:1)

您可以在JNI here上找到一本书,其中也包含一些代码示例。

但我建议先学习用C或C ++编程,尤其是指针内容(因为你需要它)。

你创建DLL文件的方式取决于你使用的编译器,上面的书中描述了一些...