使用JNA——JAVA调用DLL(1)

最近有个项目需要用JAVA调用基于DLL的SDK方法,就花时间把Jna研究了下,把研究的过程记录下来。
所谓JNA就是“Java Native Access”的缩写。说白了就是Java直接访问/调用本地动态库。最好的入门方法就是从JNA的官网开始。

1.前期准备
在maven仓库中下载jna最新版本。我下载的是4.5.1版本的。下载好了将jar添加至项目中就可以使用了。下载地址:
http://mvnrepository.com/artifact/net.java.dev.jna/jna
如果项目是maven集成的,可以直接添加,不再赘述。
准备好需要调用SDK的DLL文件,最好还包括.h头文件【后面会介绍】。特别要注意的是DLL的版本,这是第一个坑,如果JRE的版本跟DLL的版本不一致,则会报错,程序无法运行。DLL是32位的,则JRE也要是32位。由于我的DLL提供的是32位,在64位JRE下找了无数的资料都没解决,但是改成32位的JRE就行了。如果DLL是64位的,我还没有试过,欢迎用过的网友补充。
如果没有DLL,则需要自备cpp文件并且编译。编译的时候需要注意生成的版本是32位还是64位。这个不是本文的重点就不多说了。
将生成的DLL放在相应系统的目录下。因为是DLL,所以只能在Windows平台下运行,不过这里也要注意平台的版本号!如果是64位系统,DLL应该放在C:\Windows\SysWOW64目录下;是32位系统,则放在C:\Windows\System32目录下。看网上有人说,放在项目或是jre\lib目录里面,经本人测试不行,不知道有成功的没?

2.编写测试类
前期准备工作确定做好了之后,就可以编写测试代码调用SDK了。
首先,新建项目。将JNA添加至环境中,在Libraries选项卡选择Add External JARs,然后选择你下载的jna.jar。
然后,在com.sun.jna.examples下新建HelloWorld类,在类中创建CLibrary 接口继承CallLibraary或是StdCallLibrary,需要根据DLL和头文件的规定确定。示例代码如下

package com.sun.jna.examples;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/** Simple example of JNA interface mapping and usage. */
public class HelloWorld {

    // This is the standard, stable way of mapping, which supports extensive
    // customization and mapping of Java to native types.

    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary)
            Native.load((Platform.isWindows() ? "msvcrt" : "c"),
                                CLibrary.class);

        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i=0;i < args.length;i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}

参考资料:
《深入浅出JNA——快速调用原生函数》
JNA项目链接

你可能感兴趣的:(框架-JNA)