Hello JNI:基于MinGW的Windows10系统JNI调用
作者:互联网
操作系统:Windows10
准备工作:
- 安装并配置JDK环境[1]
- 安装并配置MinGW环境[2]
- 安装Windows Terminal
实践步骤:
- 编写Java代码
考虑到实际项目中,都是在项目文件夹内。所以,示例也写在某个项目中。
示例项目所在路径为:D:\Code\Java\afunx\HelloJNI
示例项目中java文件路径为:D:\Code\Java\afunx\HelloJNI\src\com\afunx\demo\jni\HelloJNI.java
具体java代码如下:
package com.afunx.demo.jni;
public class HelloJNI {
native void hello();
static {
// 注意: Windows必须为libHelloJni
System.loadLibrary("libHelloJni");
}
public static void main(String args[]) {
HelloJNI helloJNI = new HelloJNI();
helloJNI.hello();
}
}
特别注意的是:System.loadLibrary的参数为libHelloJni
- 生成C语言头文件
先生成.class文件
PS D:\Code\Java\afunx\HelloJNI> javac -classpath .\src\ .\src\com\afunx\demo\jni\HelloJNI.java
PS D:\Code\Java\afunx\HelloJNI> ls .\src\com\afunx\demo\jni\
目录: D:\Code\Java\afunx\HelloJNI\src\com\afunx\demo\jni
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2021/6/12 9:28 474 HelloJNI.class
-a---- 2021/6/6 10:45 245 HelloJNI.java
再生成.h头文件
PS D:\Code\Java\afunx\HelloJNI> javah -classpath .\src\ com.afunx.demo.jni.HelloJNI
PS D:\Code\Java\afunx\HelloJNI> ls
目录: D:\Code\Java\afunx\HelloJNI
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/6/6 10:44 .settings
d----- 2021/6/6 10:44 bin
d----- 2021/6/6 10:44 src
-a---- 2021/6/6 10:44 301 .classpath
-a---- 2021/6/6 10:44 384 .project
-a---- 2021/6/12 9:30 483 com_afunx_demo_jni_HelloJNI.h
打开com_afunx_demo_jni_HelloJNI.h
,可以看到文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_afunx_demo_jni_HelloJNI */
#ifndef _Included_com_afunx_demo_jni_HelloJNI
#define _Included_com_afunx_demo_jni_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_afunx_demo_jni_HelloJNI
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_afunx_demo_jni_HelloJNI_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
- 编写C代码
创建com_afunx_demo_jni_HelloJNI.c
文件,内容如下:
#include "com_afunx_demo_jni_HelloJNI.h"
JNIEXPORT void JNICALL Java_com_afunx_demo_jni_HelloJNI_hello
(JNIEnv *env, jobject obj)
{
printf("Hello Jni\n");
return;
}
保存到D:\Code\Java\afunx\HelloJNI
路径下。
PS D:\Code\Java\afunx\HelloJNI> ls
目录: D:\Code\Java\afunx\HelloJNI
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/6/6 10:44 .settings
d----- 2021/6/12 10:13 bin
d----- 2021/6/12 10:37 src
-a---- 2021/6/12 10:15 473 .classpath
-a---- 2021/6/6 10:44 384 .project
-a---- 2021/6/12 9:36 183 com_afunx_demo_jni_HelloJNI.c
-a---- 2021/6/12 9:30 483 com_afunx_demo_jni_HelloJNI.h
- 生成C共享库[3]
我的JDK路径为D:\Program Files (x86)\Java\jdk1.8.0_231
PS D:\Code\Java\afunx\HelloJNI> mkdir libs
目录: D:\Code\Java\afunx\HelloJNI
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/6/12 11:43 libs
PS D:\Code\Java\afunx\HelloJNI> gcc -I 'D:\Program Files (x86)\Java\jdk1.8.0_231\include' -I 'D:\Program Files (x86)\Java\jdk1.8.0_231\include\win32' -shared -o libs/libHelloJni.dll com_afunx_demo_jni_HelloJNI.c
PS D:\Code\Java\afunx\HelloJNI> ls libs
目录: D:\Code\Java\afunx\HelloJNI\libs
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2021/6/12 11:44 48068 libHelloJni.dll
- 运行Java程序
由于在在做第二步(生成C语言头文件)时,已生成了class
文件。故最后只需运行即可:
PS D:\Code\Java\afunx\HelloJNI> java -D'java.library.path=.\libs' -classpath src com.afunx.demo.jni.HelloJNI
Hello Jni
引用:
[1] Windows 10 配置Java 环境变量(菜鸟教程)
[2] MinGW-w64 for Windows(x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z) 离线安装包附安装教程
[3] 【C++】如何使用GCC生成动态库和静态库
标签:jni,Java,Windows10,----,MinGW,HelloJNI,JNI,com,afunx 来源: https://blog.csdn.net/afunx/article/details/117618921