环境准备
最近因为项目原因需要使用到JNI
,但是找了下网上,大家的都层次不齐,有的是32位的操作系统,也不太符合我的需求,所以,在此写下留个纪念,文章虽短,还是走了很多的坑路,然后总结出来的,希望大家多多支持啦.
文中涉及到类加载器的使用,感兴趣的可以百度或者Google一下,本文就不进行详细叙述了.
注意:本文所有的使用的都是64位
gcc安装
1.下载并进行安装
https://sourceforge.net/projects/mingw-w64/
2.进入并进行选择安装,可以参考下面这篇文章进行安装
https://jingyan.baidu.com/article/19192ad816ea01e53e570730.html
3.配置环境变量
在path里面加入如下参数即可,我的安装目录是在 E:\mingw64\
E:\mingw64\mingw64\bin;
4.查看是否安装成功
gcc -v
jdk安装
对于开发java的人来说,应该都是有的吧,只是我的jdk版本是1.8 64
位的
image.png
开发工具
IDEA
项目创建
1.创建项目名JNI
2.层次结构
image.png
3.编写HelloWorld
package com.wanggan.jni;
/**
* @author wanggan
*/
public class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
创建c文件并进行编译
1.使用javah
创建头文件
在src目录下使用如下命令javah com.wanggan.jni.HelloWorld
,此时,在src文件夹下面会生成一个com_wanggan_jni_HelloWorld.h
的文件
2.创建.c
文件
将上面的`.h`文件可以拷贝出来,然后创建一个文件夹并放在下面(例如文件夹叫demo),并创建一个文件叫`com_wanggan_jni_HelloWorldImpl.c`,结构为:
image.png
`com_wanggan_jni_HelloWorldImpl.c`内容为:
#include "jni.h"
#include "com_wanggan_jni_HelloWorld.h"
JNIEXPORT void JNICALL
Java_com_wanggan_jni_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){
printf("this is c print content,it's magic\n");
return;
}
可以看出,文件中调用了`jni.h`,并使用了创建出来的的`.h`文件
3.进行编译
`gcc -I %java_home%\include -I %java_home%\include\win32 com_wanggan_jni_HelloWorldImpl.c -shared -o hello.dll`
说明:
1.`-I` 是指定加载这下面的预处理文件,因为需要使用到`jni.h`和`jni_md.h`,分别可以在这两个下面找到,
2.`hello.dll`即是java中`System.loadLibrary("hello");`调用的库文件名称,
3.此时文件夹下面生成了一个叫`hello.dll`文件
4.将编译好的.dll
文件放到项目根目录下即可
5.在控制台或编辑器进行执行
编辑器:
在编辑器中执行一般都不会报错,如果报错,可以设置下vm参数,`-Djava.library.path=你的项目根路径`
控制台:
1.控制台在src文件夹下面执行命令`javac com\wanggan\jni\HelloWorld.java`,
2.再进行执行`java com.wanggan.jni.HelloWorld`
3.控制台会报错,因为加载器默认加载的是`java.library.path`,因为dll文件不在那个环境变量目录下,此时我们可以指定`java.library.path`,
4.我们可以在根目录下面创建一个dll文件夹,将生成的dll文件放到这个文件夹下面,然后再执行
`java -Djava.library.path="E:\IDEA PROJECT\JNI\dll" com.wanggan.jni.HelloWorld`
6.执行结果截图
image.png
疑问解答
因为不是经常看,所以请在下边进行留言,看到后会尽快回复,谢谢,如果文中有什么不对的地方,麻烦大家帮忙提出,我回尽快优化并进行整理.
最后,非常感谢各位的支持.