Java调用dll的几种方法

Java_JNI调用C/C++代码

JNI,是Java Native Interface的简称,中文是“Java本地调用”。通过这种技术可以做到以下两点:

  • Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。
  • Native程序中的函数可以调用Java层的函数,也就是说在C/C++程序中可以调用Java的函数。

JNI并不是什么特别神奇的东西,当初SUN推出它的目的是为了屏蔽不同操作系统平台的差异性,通过Java语言来调用Native语言的功能模块,避免重复制作车轮,最主要是这两个目的。
主要步骤如下:

  • 首先在Java类中声明一个native的方法
  • 使用Javah命令生成native方法的声明的C/C++头文件
  • 按照生成的C/C++头文件来编写C/C++源文件
  • 将C/C++源文件编译成动态链接库(DLL)
  • 将DLL文件加入到PATH环境变量下

在eclipse中创建一个Java项目

Java调用dll的几种方法_第1张图片

创建了一个命为:JNI的项目,新建包名为bingcao,新建类为TestJNI
接着在TestJNI类当中声明我们的本地方法:

package bingcao;

/**
 * @author troy
 *         2017-08-22  下午19:28
 *
 */
public class TestJNI {
    // 声明本地方法
    public native double nativeMethod();

    public static void main(String[] args) {

        /*long startTime = System.currentTimeMillis(); // 获取开始时间
        // // 加载动态链接库
        System.load("D:/documents/visual studio 2013/Projects/nativeDLL/x64/Debug/nativeDLL.dll");

        TestJNI nativeCode = new TestJNI();
        double result = nativeCode.nativeMethod();
        System.out.println(result);
        System.out.println("JNI成功调用dll!!!");

        long endTime = System.currentTimeMillis(); // 获取结束时间

        System.out.println("程序运行时间: " + (endTime - startTime) + "ms");*/
    }
}

/* ……*/ 内注释掉的代码后面很快会用到,暂时不用管。

用jdk中javah命令来为我们生成对应的头文件,在命令可以敲入javah -help:

Java调用dll的几种方法_第2张图片

格式为:javah 包名.文件名

成功运行后,在当前路径下生成的.h文件:
Java调用dll的几种方法_第3张图片

javah命令生成native头文件。编辑器打开头文件,有以下代码:

接着在Visual studio中创建一个win32控制台应用程序,取名为nativeDLL

最后在Eclipse中使用Java调用我们的Native代码:

package bingcao;

/**
 * @author troy
 *         2017-08-22  下午19:28
 *
 */
public class TestJNI {
    // 声明本地方法
    public native double nativeMethod();

    public static void main(String[] args) {

        long startTime = System.currentTimeMillis(); // 获取开始时间
        // // 加载动态链接库
        System.load("D:/documents/visual studio 2013/Projects/nativeDLL/x64/Debug/nativeDLL.dll");

        TestJNI nativeCode = new TestJNI();
        double result = nativeCode.nativeMethod();
        System.out.println(result);
        System.out.println("JNI成功调用dll!!!");

        long endTime = System.currentTimeMillis(); // 获取结束时间

        System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
    }
}

运行,调用成功
Java调用dll的几种方法_第4张图片

Java_JNA调用DLL

JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。

你只需要下载一个jar包,就可以使用JNA的强大功能方便地调用动态链接库中的C函数。

1,下载jna.jar: jna.jar的下载地址

2,在Java项目中引入jna.jar包;

Java调用dll的几种方法_第5张图片

3,创建一个类;

package bingcao;

import com.sun.jna.*;

/**
 * @author troy
 *         2017-08-22  下午19:28
 *
 */
public class TestJNA {

    public interface nativeDLL extends Library {

        ///当前路径是在项目下,而不是bin输出目录下。
        nativeDLL INSTANCE = (nativeDLL) Native
                .loadLibrary(
                        "D:/documents/visual studio 2013/Projects/nativeDLL/x64/Debug/nativeDLL",
                        nativeDLL.class);

        public double Java_bingcao_TestJNI_nativeMethod();
    }

    public static void main(String[] args) {

        // TODO Auto-generated method stub
        long startTime = System.currentTimeMillis(); // 获取开始时间
        double result = nativeDLL.INSTANCE.Java_bingcao_TestJNI_nativeMethod();
        System.out.println(result);
        System.out.println("JNA成功调用dll!!!");
        long endTime = System.currentTimeMillis(); // 获取结束时间
        System.out.println("程序运行时间: " + (endTime - startTime) + "ms");

    }

}

4,加载上面生成的DLL,运行结果如下:

Java调用dll的几种方法_第6张图片

你可能感兴趣的:(Java学习笔记,java,jni,native)