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项目
创建了一个命为: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:
格式为:javah 包名.文件名
成功运行后,在当前路径下生成的.h文件:
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_JNA调用DLL
JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。
你只需要下载一个jar包,就可以使用JNA的强大功能方便地调用动态链接库中的C函数。
1,下载jna.jar: jna.jar的下载地址
2,在Java项目中引入jna.jar包;
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");
}
}