java调用c++,使用clion进行JNI开发,ddl包生成以及so包生成

java调用c++,使用clion进行JNI开发,ddl包生成以及so包生成

    • java基础代码
    • 生成C++头部文件
    • 使用clion写C++实现代码
    • cmke打包构建使用
    • java调用C++执行
    • linux环境下产生CPP的so包

java基础代码

先写好对应的基础代码,先不管static加载的ddl文件,这里的ddl是后面c++代码打包生成的,使用绝对路径即可

package com.chw.gateway;/*** JNI开发*/
public class JavaWithCppApplication {static {System.load("E:\\document\\CLionProjects\\testDDL2\\cmake-build-debug\\libtestDDL2.dll");}public native int add(int a, int b);public native int sendSty(Student student);public static void main(String[] args) {JavaWithCppApplication obj = new JavaWithCppApplication();int result = obj.add(3, 5);System.out.println("Result: " + result);Student student = new Student("chw", 3);System.out.println("id:" + obj.sendSty(student));}
}
package com.chw.gateway;import lombok.AllArgsConstructor;
import lombok.Data;import java.io.Serializable;@Data
@AllArgsConstructor
public class Student implements Serializable {private String name;private Integer stuId;}

生成C++头部文件

使用javah 生成对应的头部文件,因为c++与java交互的头部文件相对复杂,初学者还是直接生成比较好,后面需要添加方法再自己手动添加,如果类再包里面,就指定报名,如果没有再package里,就直 javah 类名 就可以了

javah com.chw.gateway.JavaWithCppApplication 

生成的C++头部文件如下 JavaWithCppApplication.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_chw_gateway_JavaWithCppApplication */#ifndef _Included_com_chw_gateway_JavaWithCppApplication
#define _Included_com_chw_gateway_JavaWithCppApplication
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     com_chw_gateway_JavaWithCppApplication* Method:    add* Signature: (II)I*/
JNIEXPORT int JNICALL Java_com_chw_gateway_JavaWithCppApplication_add(JNIEnv *, jobject, jint, jint);JNIEXPORT int JNICALL Java_com_chw_gateway_JavaWithCppApplication_sendSty(JNIEnv *, jobject, jobject);#ifdef __cplusplus
}
#endif
#endif

使用clion写C++实现代码

clion构建c++依赖库的话选择library进行创建项目
在这里插入图片描述
如下引入头文件后,实现我们的方法(JavaWithCppApplication.cpp)。 JavaWithCppApplication.h头文件中引用到了jni.h,这是个java与c++交互的头文件,可以到java安装目录下找win版本的可以在 D:\software\Java\jdk1.8.0_221\include\jni.hD:\software\Java\jdk1.8.0_221\include\win32\jni_md.h 可以把这两个文件直接复制到c++项目路径下。

//
// Created by chw on 2024/3/18.
//
#include <iostream>
#include "JavaWithCppApplication.h"JNIEXPORT int JNICALL Java_com_chw_gateway_JavaWithCppApplication_add(JNIEnv *, jobject, jint a, jint b) {return a + b;
}JNIEXPORT int JNICALL Java_com_chw_gateway_JavaWithCppApplication_sendSty(JNIEnv *env, jobject temp, jobject obj) {jclass jcs = env->FindClass("com/chw/gateway/Student");jfieldID fileStuId = env->GetFieldID(jcs, "stuId", "Ljava/lang/Integer;");jobject intObj = env->GetObjectField(obj, fileStuId);jclass intClass = env->FindClass("java/lang/Integer");jmethodID intValue = env->GetMethodID(intClass, "intValue", "()I");jint value = env->CallIntMethod(intObj, intValue);std::cout << "stuId:" << value << std::endl;jfieldID fileName = env->GetFieldID(jcs, "name", "Ljava/lang/String;");jstring classStr = (jstring) env->GetObjectField(obj, fileName);const char *cstr = env->GetStringUTFChars(classStr, 0);std::cout << "cstr:" << cstr << std::endl;return value;
}

使用的是cmake构建的话,那么就直接在CMakeLists.txt 中添加依赖就可以加上jni 依赖

cmake_minimum_required(VERSION 3.27)
project(testDDL2)set(CMAKE_CXX_STANDARD 17)find_package(JNI REQUIRED)include_directories(${JNI_INCLUDE_DIRS})add_library(testDDL2 SHAREDJavaWithCppApplication.cpp)# 链接 JNI 库
target_link_libraries(testDDL2 ${JNI_LIBRARIES})

cmke打包构建使用

在clion中点击构建,就可以打包产生我们需要的ddl文件了
在

java调用C++执行

如果你使用的是clion默认安装的c++的话,需要将clion默认安装的c++执行环境配置到系统环境变量,保证在命令行执行g++能够成功执行,我的是在 D:\software\JetBrains\CLion 2023.3.1\bin\mingw\bin 需要将这个路径配置在环境path下,否则java调用c++的时候就会出现ddl链接不到等问题,以及不可用等。配置好环境变量后需要重新启动下idea,否则环境变量还是加载不到,如果还是没生效就重启电脑。(我这里win11就是配置了重启才生效的)
如下成功调用

在这里插入图片描述

linux环境下产生CPP的so包

保证linux主机上安装有java的linux版本以及C++,cmake
将本地的项目整个上传到linux环境,到项目路径下,我这里是testDDL2,

cd  /home/chw/Documents/jni_test/testDDL2
mkdir build
cd build
cmake ..
make

构建完了之后再生成so文件 /home/chw/Documents/jni_test/testDDL2/build/libtestDDL2.so

如果爆出cmake版本不匹配就把CMakeLists.txt 里面的 cmake_minimum_required(VERSION 3.27) 版本调整一下,降低或者升高匹配一下安装的cmake版本。
如果还爆出某些依赖包找不到的问题,报错Could NOT find JNI (missing: JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2),详细报错如下:

CMake Error at /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:230 (message):Could NOT find JNI (missing: JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2)
Call Stack (most recent call first):/usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)/usr/local/share/cmake-3.23/Modules/FindJNI.cmake:382 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)CMakeLists.txt:20 (find_package)

就加一下下面这里配置在CMakeLists.txt

# JAVA_INCLUDE_PATH为jni.h所在路径,一般在jdk目录下的include中
set(JAVA_INCLUDE_PATH /home/chw/software/jdk1.8.0_211/include)
# JAVA_INCLUDE_PATH2为jni_md.h所在路径,一般在jdk目录下的include/linux中
set(JAVA_INCLUDE_PATH2 /home/chw/software/jdk1.8.0_211/include/linux)
set(JAVA_AWT_INCLUDE_PATH /home/chw/software/jdk1.8.0_211/include)
set(JAVA_AWT_LIBRARY /home/chw/software/jdk1.8.0_211/lib)
set(JAVA_JVM_LIBRARY /home/chw/software/jdk1.8.0_211/lib)

在java中引入对应的so包就可以执行了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

主干网络篇 | YOLOv8改进之用RCS-OSA替换C2f(来源于RCS-YOLO)

前言:Hello大家好,我是小哥谈。RCS-YOLO是一种目标检测算法,它是基于YOLOv3算法的改进版本。通过查看RCS-YOLO的整体架构可知,其中包括RCS-OSA模块。RCS-OSA模块在模型中用于堆叠RCS模块,以确保特征的复用并加强不同层之间的信息流动。本文就给大家详细介绍如何将RCS-YOLO…

freeRTOS学习

总结 1.总结任务调度算法之间的区别 调度算法&#xff1a;抢占式调度&#xff1a;优先级高的任务可以打断低优先级任务的执行&#xff0c;适用于不同优先级任务的执行。 时间片轮换&#xff1a;分配时间片&#xff08;1ms&#xff09;&#xff0c;时间片耗尽时&#xff0c;任…

[羊城杯 2020]EasySer

[羊城杯 2020]EasySer 进入页面&#xff0c;发现是ubuntuapache2&#xff0c;但是好像没啥用 尝试访问/robots.txt&#xff0c;得到 访问/star1.php/&#xff0c;查看源码&#xff0c;得到提示 一看就知道是ssrf&#xff0c;使用http://127.0.0.1/ser.php&#xff0c;得到…

鸿蒙OS开发实例:【ArkTS类库异步并发async/await】

async/await是一种用于处理异步操作的Promise语法糖&#xff0c;使得编写异步代码变得更加简单和易读。通过使用async关键字声明一个函数为异步函数&#xff0c;并使用await关键字等待Promise的解析&#xff08;完成或拒绝&#xff09;&#xff0c;以同步的方式编写异步操作的代…

关系(二)利用python绘制热图

关系&#xff08;二&#xff09;利用python绘制热图 热图 &#xff08;Heatmap&#xff09;简介 热图适用于显示多个变量之间的差异&#xff0c;通过颜色判断彼此之间是否存在相关性。 快速绘制 基于seaborn import seaborn as sns import pandas as pd import numpy as np i…

【微服务】软件架构的演变之路

目录 单体式架构的时代单体式架构(Monolithic)优点缺点适用场景单体式架构面临诸多问题1.宽带提速&#xff0c;网民增多2.Web2.0时代的特点问题描述优化方向 集群优点缺点适用场景搭建集群后面临诸多问题用户请求问题用户的登录信息数据查询 改进后的架构 垂直架构优点缺点 分布…

实战 | YOLOv8自定义数据集训练实现手势识别 (标注+训练+预测 保姆级教程--含数据集)

导 读 本文将手把手教你用YoloV8训练自己的数据集并实现手势识别。 安装环境 【1】安装torch, torchvision对应版本,这里先下载好,直接安装 pip install torch-1.13.1+cu116-cp38-cp38-win_amd64.whlpip install torchvision-0.14.1+cu116-cp38-cp38-win_amd64.whl 安装好…

iOS系统文件路径解析:探索苹果手机中各类重要文件的存储位置

​ 目录 引言 用户登录工具和连接设备 查看设备信息&#xff0c;电池信息 查看硬盘信息 硬件信息 查看 基带信息 销售信息 电脑可对手机应用程序批量操作 运行APP和查看APP日志 IPA包安装测试 注意事项 引言 苹果手机与安卓手机不同&#xff0c;无法直接访问系统文件…

从《布瓦尔与佩库歇》实践中学习社会科学概论

从《布瓦尔与佩库歇》实践中学习社会科学概论 前情提要《布瓦尔与佩库歇》实践笔记云藏山鹰社会科学概论报告核心--信息形数身知™意合™意气实体过程意气实体过程宇宙学诠释™ 社会科学概论花间流风版导读&#xff0c;马斯克风格演讲[ 一尚韬竹团队供稿&#xff1b;] 内容展开…

音乐家马常旭当选为中华名人库委员会副主席

4月2日&#xff0c;据中华名人库官网显示&#xff0c;马常旭已当选为中华名人库委员会副主席。此前马常旭是一名音乐家、中国内地著名男歌手。 马常旭资料 马常旭&#xff0c;男&#xff0c;汉族&#xff0c;2002年10月生&#xff0c;辽宁大连人。现任中华名人库委员会副主席&…

数据结构第二版-陈越 第1章 概论

定义&#xff1a; 题或例子&#xff1a; 循环和递归两种方法 循环体不同

vk-unicloud 框架 H5 浏览器无法登录访问 Client platform is h5, but web was found in config

最开始出现的bug 进入云函数查看日志 Client platform is h5, but web was found in config 把这个问题扔到百度是没有答案的&#xff0c;但是找到一个类似问题 &#xff1a;Client platform is app, but app-plus was found in config. 顺藤摸瓜到uniCloud的官方文档 关于pr…

python coding with ChatGPT 专题2| 全解递归算法

文章目录 递归与栈的关系如何思考递归汉诺塔 经典题目入门&#xff1a;斐波那契数列分治法&#xff1a;归并排序树的递归遍历组合问题&#xff1a;子集搜索问题&#xff1a;N皇后 拓展阶乘的迭代法斐波那契数列迭代法青蛙跳 参考文献 掌握递归是解决许多编程问题的关键&#xf…

isaacgym 渲染黑屏

问题描述&#xff1a; isaacgym安装完IsaacGym_Preview_4_Package.tar.gz之后&#xff0c;运行python joint_monkey.py没有任何内容现实&#xff0c;但是终端还是正常输出信息。 环境是ubuntu22服务器&#xff0c;python3.8&#xff0c;nvidia Driver Version: 515.65.01 CUDA…

【JavaSE】解密 继承和多态(下)

前言 紧接着上篇 解密继承和多态&#xff08;上&#xff09;~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 protected关键字 在同一包下同一类可以访问 代码理解 在同一包下不同类可以访问 代码理解 …

HarmonyOS 应用开发之LifecycleForm接口切换LifecycleApp接口切换 LifecycleApp接口切换

LifecycleForm接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口onCreate?(want: Want): formBindingData.FormBindingData;ohos.app.form.FormExtensionAbility.d.tsonAddForm(want: Want): formBindingData.FormBindingData;onCastToNormal?(formId: string…

Octavia Venture 成立,打造数十亿美元规模的 AI 价值体系

​随着 OpenAI 相继发布 ChatGPT、Sora 等 AIGC 大模型后&#xff0c;AI 赛道的发展迎来了一轮又一轮的热潮&#xff0c;这也让极具想象力的 AI 赛道涌入大量资金&#xff0c;比如英伟达股票市值短时间内从 1 万亿美元暴涨至 2 万亿美元&#xff0c;就是最好的佐证。当然&#…

Linux ssh免密登录配置

步骤 在本地机器上生成公钥和私钥对。将本地公钥复制到远程机器的~/.ssh/authorized_keys文件中。 实现1 在服务器上生成SSH密钥对 ssh-keygen -t rsa -f /home/id_rsa1ssh-keygen: 这是一个用于生成、管理和转换 SSH 密钥的 OpenSSH 工具。-t rsa: 用于指定要生成的密钥类…

Python学习:面相对象

面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实…

【AI绘画/作图】风景背景类关键词模板参考

因为ds官网被墙,所以翻了IDE的源码整理了下stablestudio里的官方模板&#xff0c;顺便每个模板生成了一份…不知道怎么写关键词的可以参考 Stunning sunset over a futuristic city, with towering skyscrapers and flying vehicles, golden hour lighting and dramatic cloud…