Linux环境

Windows环境

第一步:安装c/c++编译环境

注意JDK版本,如果是64位的,编译环境也要安装的对应的64位的。

编译环境MinGW的安装

下载地址:http://mingw-w64.org/doku.php/download/mingw-builds

下载运行安装即可,注意选择64位的。

编写java类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.ymu.javase.jni;

public class HelloJNI {

static {
// hello.dll (Windows) or libhello.so (Unixes)
// System.load(""); //加载的全路径文件名
System.loadLibrary("jni/hello");
}

private native void sayHello();

public static void main(String[] args) {
HelloJNI helloJNI = new HelloJNI();
helloJNI.sayHello();
}
}

生成C语言调用头文件

script
1
2
E:\xinxiamu.github\java-core\src\main\java\com\ymu\javase\jni>D:\jdk-11.0.3\bin\
javac.exe -h E:\xinxiamu.github\java-core\jni HelloJNI.java

HelloJNI.java所在文件目录下执行,生成的头文件在目录E:\xinxiamu.github\java-core\jni下。

生成的头文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ymu_javase_jni_HelloJNI */

#ifndef _Included_com_ymu_javase_jni_HelloJNI
#define _Included_com_ymu_javase_jni_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ymu_javase_jni_HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_ymu_javase_jni_HelloJNI_sayHello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

方法名称构成:Java_包名_类名_方法名。

编写C语言代码

拷贝头文件的c方法,并实现:

1
2
3
4
5
6
7
8
9
10
11
// Save as "HelloJNI.c"
#include <jni.h> // JNI header provided by JDK
#include <stdio.h> // C Standard IO Header
#include "com_ymu_javase_jni_HelloJNI.h" // Generated

// Implementation of the native method sayHello()
JNIEXPORT void JNICALL Java_com_ymu_javase_jni_HelloJNI_sayHello
(JNIEnv *, jobject) {
printf("Hello World!\n");
return;
}

生成链接库文件.dll

在mingw安装目录下,找到可执行文件g++.exe。注意,一定要在环境变量中配置好JAVA_HOME。

script
1
D:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin>"g++.exe" -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o E:\xinxiamu.github\java-core\jni\hello.dll  E:\xinxiamu.github\java-core\cpp\com_ymu_javase_jni_HelloJNI.c

会在E:\xinxiamu.github\java-core\jni生成库链接文件hello.dll。

E:\xinxiamu.github\java-core\cpp\com_ymu_javase_jni_HelloJNI.c为对应c语言源文件。

hello.dll文件拷贝到jni目录下。

执行java文件,验证是否成功调用c语言

执行HelloJNI.java类main方法,如果成功,可以看到: