操作系统:centos7
下载jdk
xxxxxxxxxx
mkdir -p /data/jdk && cd /data/jdk
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz"
#解压
tar -zxvf jdk-8u141-linux-x64.tar.gz
配置profile
xxxxxxxxxx
vi /etc/profile
#文件尾部新增如下配置(目录若不同,自行修改)
export JAVA_HOME=/data/jdk/jdk1.8.0_141
export PATH=$PATH:$JAVA_HOME/bin
使环境变量立刻生效:
xxxxxxxxxx
source /etc/profile
这里以常见的windows64位操作系统为例说明
下载mingw
这里要安装64位的mingw
跳转到https://sourceforge.net/projects/mingw-w64/files/mingw-w64/,
MinGW-W64 Online Installer下表示exe安装版本(安装过程需要联网,可能失败),MinGW-W64 GCC-8.1.0下表示离线版本,这里选择离线版本x86_64-posix-sjlj
。
下载后解压缩,将里面的mingw64
复制到任意目录,这里是C:\mingw64
接着设置C:\mingw64\bin
为环境变量,安装完毕
使用mingw安装gcc
离线安装版自带gcc,不用额外安装gcc
cmd运行命令,等待执行结束即安装完毕。
xxxxxxxxxx
mingw-get install gcc
java代码
HelloJNI.java
xxxxxxxxxx
public class HelloJNI {
// 加载 DLL
static {
System.loadLibrary("hello");
}
// 声明本地方法
private native void hello();
// main 方法调用本地方法
public static void main(String[] args) {
new HelloJNI().hello();
}
}
代码编写完成后,需要生成供c语言使用的头文件
xxxxxxxxxx
javac HelloJNI.java
javah -jni HelloJNI
执行完毕后,会生成一个HelloJNI.h
文件
注意这个头文件声明了导出的java本地方法
hello
在c语言中对应的方法名:Java_HelloJNI_hello
xxxxxxxxxx
/* DO NOT EDIT THIS FILE - it is machine generated */
/* Header for class HelloJNI */
extern "C" {
/*
* Class: HelloJNI
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_hello
(JNIEnv *, jobject);
}
c代码
在c语言中就可以编写Java_HelloJNI_hello方法的实现了:
hello.c
xxxxxxxxxx
JNIEXPORT void JNICALL Java_HelloJNI_hello(JNIEnv *env, jobject thisObj) {
printf("Hello from C!\n");
return;
}
该实现即当java调用该方法时,会打印Hello from C!
。
注意事项
hello.c的方法签名已经在HelloJNI.h中定义好了,这里编写实现方法时要保证参数类型和返回值类型和HelloJNI.h中定义保持一致。
生成dll文件
编译包含java jni的c代码,需要用到jdk提供的头文件(jni.h), 因此gcc编译的时候要通过-I
指定头文件搜索的路径,这里指定了两个路径。另外-m64
表示编译为64位版本的dll文件。
xxxxxxxxxx
gcc -shared -o hello.dll -I"D:\Program Files\Java\jdk1.8.0_202\include" -I"D:\Program Files\Java\jdk1.8.0_202\include"\win32 -m64 hello.c
运行java代码
xxxxxxxxxx
javac HelloJNI.java
java HelloJNI
这时候可以看到控制台输出:
xxxxxxxxxx
Hello from C!
我们非常希望这篇文章能为你提供所需的帮助。你的反馈和建议对我们来说都是宝贵的资源。如果你有任何想法或问题,别犹豫,请在下方评论区留言。同时,如果你觉得这篇文章有用,欢迎分享给你的朋友们。你的参与促使我们前行,期待与你一起学习和成长。
如果这篇文章对您有帮助,也可以赞赏博主喝杯茶~