ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-06-12 12:02:02  阅读:220  来源: 互联网

标签:jni Java Windows10 ---- MinGW HelloJNI JNI com afunx


操作系统: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

  1. 生成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
}
  1. 编写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
  1. 生成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
  1. 运行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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有