操作系统:centos7
下载jdk
xxxxxxxxxxmkdir -p /data/jdk && cd /data/jdkwget --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
xxxxxxxxxxvi /etc/profile#文件尾部新增如下配置(目录若不同,自行修改)export JAVA_HOME=/data/jdk/jdk1.8.0_141export PATH=$PATH:$JAVA_HOME/bin
使环境变量立刻生效:
xxxxxxxxxxsource /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运行命令,等待执行结束即安装完毕。
xxxxxxxxxxmingw-get install gcc
java代码
HelloJNI.java
xxxxxxxxxxpublic class HelloJNI { // 加载 DLL static { System.loadLibrary("hello"); } // 声明本地方法 private native void hello(); // main 方法调用本地方法 public static void main(String[] args) { new HelloJNI().hello(); }}代码编写完成后,需要生成供c语言使用的头文件
xxxxxxxxxxjavac HelloJNI.javajavah -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
xxxxxxxxxxJNIEXPORT 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文件。
xxxxxxxxxxgcc -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代码
xxxxxxxxxxjavac HelloJNI.javajava HelloJNI这时候可以看到控制台输出:
xxxxxxxxxxHello from C!我们非常希望这篇文章能为你提供所需的帮助。你的反馈和建议对我们来说都是宝贵的资源。如果你有任何想法或问题,别犹豫,请在下方评论区留言。同时,如果你觉得这篇文章有用,欢迎分享给你的朋友们。你的参与促使我们前行,期待与你一起学习和成长。
如果这篇文章对您有帮助,也可以赞赏博主喝杯茶~