本文采用的配套软件版本:
Windows 10 64位
Eclipse Version: 2018-09 (4.9.0)
jdk-8u191
tdm64-gcc-5.1.0-2 官网地址:http://tdm-gcc.tdragon.net/download (下载地址:https://download.youkuaiyun.com/download/axwolfer/10931095)
Eclipse 插件 CDT 9.4
参考教程:http://www3.ntu.edu.sg/home/ehchua/programming/java/javaNativeInterface.html
Demo下载:https://download.youkuaiyun.com/download/axwolfer/10931092
1、安装JDK
2、安装Eclipse
3、安装TDM
安装完成后,进入到安装目录(我的安装目录是C:\TDM-GCC-64)下的bin目录,将文件mingw32-make.exe复制一份,修改名称为make.exe
将JDK的inlude文件夹下的jni.h和include/win32下的jni_md.h文件COPY到TDM-GCC-64的include(我本地路径是C:\TDM-GCC-64\include)文件夹和x86_64-w64-mingw32\include(我本地路径是C:\TDM-GCC-64\x86_64-w64-mingw32\include)文件夹下
4、打开Eclipse,在菜单栏中选择“Help-Eclipse Maketplace...”,在Find中输入CDT,搜索到CDT后单击Install进行安装,安装后重启Eclipse
5、采用default包名的案例:
5.1 创建一个名为HelloJNI的Java Project项目
5.2 在HelloJNI中创建一个名为HelloWorld的java类,其内容如下:
public class HelloWorld {
static {
System.loadLibrary("hello"); //加载hello.dll
}
public native void sayHello();
// 测试
public static void main(String[] args) {
new HelloWorld().sayHello();
}
}
5.3 创建.h头文件: 在HelloWorld.java文件上右键,选择“New-Other”,在弹出的向导里选择“Convert to a C/C++ Project(Adds C/C++ Nature)”
5.4 在HelloJNI项目节点上右键,选择新建文件夹,命名为jni,我们把C相关的代码都放到这个目录下
5.5 在jni文件夹上右键,新建文件,命名为Makefile,其内容如下:
# Define a variable for classpath
CLASS_PATH = ../bin
# Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)
all : hello.dll
# $@ matches the target, $< matches the first dependency
hello.dll : HelloWorld.o
gcc -Wl,--add-stdcall-alias -shared -o $@ $<
# $@ matches the target, $< matches the first dependency
HelloWorld.o : HelloWorld.c HelloWorld.h
gcc -c $< -o $@
# $* matches the target filename without the extension
HelloWorld.h : HelloWorld.class
javah -classpath $(CLASS_PATH) $*
5.6 在jni文件夹节点上右键,选择“Build Targets->Create”,在弹出的创建对话框中输入HelloWorld.h,如下图:
5.7 在创建的Build Targets下选择HelloWorld.h节点,右键选择Build Targets,执行后会在jni下生成HelloWorld.h文件
5.8 在jni下新建Source file,命名为HelloWorld.c,内容如下:
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World! god\n");
return;
}
5.9 如5.6操作,创建all,然后如5.7执行对应BuildTargets,在jni目录下会生成hello.dll文件
5.10 选择HelloWorld.java,右键选择"Run as->Run configurations",在弹出的对话框中选择Arguments,在VM arguments中设置dll的目录,本例中是: -Djava.library.path=jni
5.11 执行HelloWorld.java,按预期打印出了信息
6、采用自定义包名的案例
如果我们创建了自己的pacage,在Makefile中需要对应的做修改。
本例中我的包名是test,在test包中新建了HelloJNI.java,Makefile中增加如下内容:
HelloJNI : HelloJNI.dll
HelloJNI.dll : HelloJNI.o
gcc -Wl,--add-stdcall-alias -shared -o $@ $<
HelloJNI.o : HelloJNI.c HelloJNI.h
gcc -c $< -o $@
# HelloJNI.class is located in test folder
HelloJNI.h : test/HelloJNI.class
javah -classpath $(CLASS_PATH) test.$*
clean :
rm HelloWorld.h HelloWorld.o hello.dll
其他操作类似。