1. 编写 Java 代码
1.1 创建 Maven 工程

1.2 创建 Test 类
package com.jezetek;
public class Test {
static {
System.out.println("java.library.path: " + System.getProperty("java.library.path"));
System.out.println("PATH: " + System.getenv("PATH"));
try {
System.loadLibrary("JniTest");
} catch (Exception e) {
e.printStackTrace();
}
}
public native int test();
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.test());
}
}
1.3 生成 Test 类对应头文件
使用 javac 命令行工具生成 Test 类对应头文件,命令如下:
javac -h . Test.java
执行完上述命令之后,会在 Test 类同级目录下生成 com_jezetek_Test.h 头文件
1.4 打包 Java 工程
pom.xml 配置文件内容为:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jezetek</groupId>
<artifactId>JniTest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.1</version>
<configuration>
<archive>
<manifest>
<mainClass>com.jezetek.Test</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 编写 Qt 代码
2.1 创建 Qt lib 动态链接库(dll)工程


2.2 引入 JDK 头文件
在 JniTest.pro 工程文件中添加:
INCLUDEPATH += \
"D:\java\jdk1.8.0_441\include" \
"D:\java\jdk1.8.0_441\include\win32" \
2.3 将 com_jezetek_Test.h 头文件加入工程
将 com_jezetek_Test.h 文件拷贝到 Qt 工程中,然后在 JniTest.pro 工程文件中添加:
HEADERS += \
com_jezetek_Test.h
com_jezetek_Test.h 文件内容为:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jezetek_Test */
#ifndef _Included_com_jezetek_Test
#define _Included_com_jezetek_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jezetek_Test
* Method: test
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_jezetek_Test_test
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
⭐ 2.4 新增 com_jezetek_Test.cpp 源文件添加实现
为工程新增 com_jezetek_Test.cpp 源文件,内容为:
#include "com_jezetek_Test.h"
jint Java_com_jezetek_Test_test(JNIEnv *, jobject)
{
return 100;
}
⚠️ 注意
JNI 调用的是 dll 动态链接库,在构建 dll 时,只有
.cpp源文件中的实现才会被编译并打包到 DLL 中。.h文件中的函数声明用于在编译时告诉编译器函数的存在,不会直接打包到 dll 中。所以,函数具体实现需要在.cpp中完成。
⭐ 2.4 链接 JDK jvm 库
注意,还需要在 JniTest.pro 工程文件中链接 jvm.lib(即 jvm.dll 辅助文件),在 JniTest.pro 工程文件添加:
LIBS += \
-L"D:\java\jdk1.8.0_441\lib" -ljvm
2.5 整个 JniTest.pro 文件内容
QT -= gui
TEMPLATE = lib
CONFIG += c++11 console dll
CONFIG -= app_bundle
DEFINES += QT_DEPRECATED_WARNINGS
INCLUDEPATH += \
"D:\java\jdk1.8.0_441\include" \
"D:\java\jdk1.8.0_441\include\win32" \
LIBS += \
-L"D:\java\jdk1.8.0_441\lib" -ljvm
HEADERS += \
com_jezetek_Test.h
SOURCES += \
com_jezetek_Test.cpp
⭐ 2.6 Release 模式编译构建
注意,编译构建 Qt 工程以生成 dll 动态库,必须使用 Release 模式。
构建成功,会在构建目录下的 release 文件夹下生成 JniTest.dll 动态链接库文件。
3. 运行
⭐ 3.1 配置系统环境变量
在运行之前,我们需要将 Qt 库目录,JDK 库目录添加到系统环境变量中。

3.2 执行
如果你将 JniTest.dll 动态链接库文件路径也配置到系统环境变量中,那么可以直接执行:
java -jar JniTest-1.0-SNAPSHOT.jar
当然,你也可以将 JniTest.dll 动态链接库文件拷贝到 JniTest-1.0-SNAPSHOT.jar 同级目录下,然后执行:
java -Djava.library.path=. -jar JniTest-1.0-SNAPSHOT.jar
执行结果如下:

可以看到打印了函数返回值 100。
1494

被折叠的 条评论
为什么被折叠?



