目录结构:
|-HelloWorld
|--src
|---main
|----java
|-----main.java
|----cpp //和java目录同级
|----CMakeLists.txt //cmake配置文件
|-----src // c\c++ 源文件目录
|------HelloWorld.cpp
|-----build // 生成文件目录
|-----include //头文件目录
|-----lib //依赖文件目录
创建java程序:
public class HelloWorld {
//静态加载库文件
// 需要注意load方法需要提供完整的路径, loadLibrary 只需要提供名称就可以了,可以自动加载.class文件夹下的对应名称的dll文件
// static {
// System.loadLibrary("native");
// System.load(System.getProperty("user.dir") + "\\..\\cpp\\build\\native.dll");
// }
//库文件提供的方法
public native void printHelloWorld();
public static void main(String[] args) {
//动态加载库文件
System.load("C:\\Users\\djatm\\Desktop\\temp\\JNIHelloWorld-main\\src\\main\\cpp\\build\\libnative.dll");
HelloWorld helloWorld = new HelloWorld();
//调用提供的方法
helloWorld.printHelloWorld();
}
}
然后用cmd切换到HelloWorld.java 的目录下执行命令:
javac -h . HelloWorld.java
生成文件:
将生成的HelloWorld.h 放入到 cpp下面的 include目录 并 实现相应方法
#include <jni.h> // 引入Java预定义宏
#include <iostream>
#include "HelloWorld.h" //生成的头文件
void sayHello(){
std::cout << "Hello from C++ !!" << std::endl;
}
JNIEXPORT void JNICALL Java_HelloWorld_printHelloWorld
(JNIEnv* env, jobject thisObject) {
sayHello();
}
并配置CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 11)
project(test)
set(SRC src/HelloWorld.cpp) # 配置cpp源文件到SRC变量中
set(EXECUTABLE_OUTPUT_PATH ./build) #配置输出目录
set(JAVA_HOME $ENV{JAVA_HOME}) #获取系统环境变量中的JAVA_HOME并设置到JAVA_HOME 变量中
include_directories( #引入的头文件位置
include
${JAVA_HOME}/include
${JAVA_HOME}/include/win32
)
add_library(native SHARED ${SRC}) #生成动态库
cmd切换到cpp的build目录运行命令:
cmake .. -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -G "MinGW Makefiles" -DCMAKE_MAKE_PROGRAM=C:/mingw64/bin/make.exe
然后执行命令
make
得到dll文件:
最后执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2023-07-15 centos 部署 javaweb (war包)