Hello JNI:基于MinGW的Windows10系统JNI调用

操作系统:Windows10

准备工作:

  1. 安装并配置JDK环境[1]
  2. 安装并配置MinGW环境[2]
  3. 安装Windows Terminal

实践步骤:

1. 编写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

2. 生成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
}

3. 编写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

4. 生成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

5. 运行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生成动态库和静态库

猜你喜欢

转载自blog.csdn.net/afunx/article/details/117618921