目录结构:
|-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,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
2023-07-15 centos 部署 javaweb (war包)