JNI是什么?
维基百科的解释:JNI (Java Native Interface,Java本地接口)是一种编程框架,使得Java虚拟机中的Java程序可以调用本地应用/或库,也可以被其他程序调用。 本地程序一般是用其它语言(C、C++或汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序。
因此可以使用JNI实现Java和C++之间的相互调用。
简单实现
** 第一步 Java代码编写**
新建一个文件夹 JniTest,在文件夹里面新建一个java文件
Hello.java
,在里面写上如下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14class Hello
{
//native声明,用于生成c/c++代码
public native void sayHelloWorld();
//加载c/c++编译好的库
static
{
System.loadLibrary("Hello");
}
public static void main(String[] args)
{
new Hello().sayHelloWorld();
}
}在该目录下的命令行窗口中编译java文件,输入
javac Hello.java
,将在该目录中生成Hello.class
文件在命令窗口中输入
javah Hello
或javah -jni Hello
,将生成Hello.h
文件打开
Hello.h
文件你会在末尾看到如下一行:1
2JNIEXPORT void JNICALL Java_Hello_sayHelloWorld
(JNIEnv *, jobject);
这个就是刚才的Hello.java
里面的sayHelloWorld()
方法加了native
关键字生成的方法
第二步 C++代码的编写
打开VS 2017,选择动态链接库(DLL)新建一个DLL工程
把第一步生成的
Hello.h
文件复制到C++的项目文件中,然后将jni.h
,jni.md.h
也复制到C++的项目文件中,其中jni.h
位于JDK安装目录下的include目录下,即jdk\include;jni.md.h
位于JDK安装目录下的include的win32目录下,即jdk\include\win32。如下:修改
Hello.h
中的代码,将第一行的<jni.h>
改成"jni.h"
编写C++代码:
1
2
3
4
5
6
7
8
9#include "stdafx.h"
#include "Hello.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_Hello_sayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello World !");
return;
}将VS 2017调试器选择64位
在类视图中选择项目右键,点击生成即可在目录下生成dll文件
将生成的dll文件拷贝到第一步的java目录下,然后将dll文件的名字改为和
System.loadLibrary("Hello");
里面加载的名字一样,即Hello.dll
在命令行中运行
java Hello
,即可实现java调用c++写的dll文件
Java调用C++获取打印机状态例子
第一步 Java代码
1 | public class GetPrintStatusUtil { |
第二步 C++获取打印机状态
1 | #include "stdafx.h" |
第三步 在IntelliJ IDEA中生成.h文件
- 在IDEA的setting->Tools->External Tools中新建一个扩展工具,如下:
Program:$JDKPath$\bin\javah
Arguments:-jni -classpath $OutputPath$ -d ./jni $FileClass$
Working directory:$ProjectFileDir$
点击apply然后ok,扩展工具就创建完成啦
- 在生成.h文件之前先build一下,生成.class文件过后才能生成.h文件
- 选中要生成.h文件的java类,右键,然后找到External Tools,这时会发现刚才生成扩展工具JNI,点击这个工具就可以在项目的jni中生成.h文件,如下:
- 将这个生成的.h文件和上述的jni.h,jni.md.h文件放到C++的dll工程目录下面,然后生成.dll文件
- 将生成的.dll文件复制到java项目的一级目录下,如下:
- 这时就可以在Java项目里面调用C++生成的.dll文件了!
参考文章:
https://blog.csdn.net/change_from_now/article/details/50370748