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 SHARED
        JavaWithCppApplication.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包就可以执行了
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

配置vscode用于STM32编译,Debug,github上传拉取

配置环境参考&#xff1a; Docs 用cubemx配置工程文件&#xff0c;用VScode打开工程文件。 编译的时候会有如下报错&#xff1a; vscode出现process_begin :CreateProcess failed 系统找不到指定文件 解决方案&#xff1a;在你的makefile中加上SHELLcmd.exe就可以了 参考…

软考高级架构师:DNS 概念和查询方式

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

约跑小程序源码(asp.net+vue+element++uniapp+sqlserver)

开发语言&#xff1a;c# 框架&#xff1a;后端 asp.net mvc pc管理页面&#xff1a;vueelement 数据库&#xff1a;sqlserver 开发软件&#xff1a;eclipse/myeclipse/idea 浏览器&#xff1a;谷歌浏览器 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X …

qt环境搭建-镜像源安装Qt Creator(5.15.2)以及配置环境变量

前言&#xff1a; 版本&#xff1a;5.15.2 镜像源&#xff1a;ustc与清华 纯小白&#xff0c;找了半天的镜像源安装qtcreator&#xff0c;搞了半天结果安装的是最新的&#xff0c;太新的对小白很不友好&#xff0c;bug比较多&#xff0c;支持的系统也不全&#xff0c;口碑不…

【使用flex两端对齐加margin-right】

解决办法众多&#xff1a;https://cloud.tencent.com/developer/article/1516801 <div class"job_tabs_content"><div class"job_tab_item"></div><div class"job_tab_item"></div><div class"job_tab_i…

RabbitMQ Docker 安装与应用

1.官方镜像 该镜像包含用户操作界面 2.Docker运行&#xff0c;并设置开机自启动 docker run -d --restartalways --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10-management 默认登录账户和密码 guest 3、使用 队列和交换机绑定

2024年妈妈杯数学建模MathorCup数学建模思路B题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…

Linux从入门到精通 --- 4(上).快捷键、软件安装、systemctl、软链接、日期和时区、IP地址

文章目录 第四章(上)&#xff1a;4.1 快捷键4.1.1 ctrl c 强制停止4.1.2 ctrl d 退出4.1.3 history4.1.4 历史命令搜索4.1.5 光速移动快捷键4.1.6 清屏 4.2 软件安装4.2.1 yum4.2.2 apt 4.3 systemctl4.4 软链接4.4.1 ln 4.5 日期和时区4.5.1 date命令4.5.2 date进行日期加减…

鸿蒙学习记录

问题小测记录 总结链接&#xff1a;小测总结 学习笔记&#xff1a;鸿蒙开发学习记录 1、 main_pages.json存放页面page路径配置信息。 2、在stage模型中&#xff0c;下列配置文件属于AppScope文件夹的是&#xff1f; app.json5 3、module.json5配置文件中&#xff0c;包含…

Stm32 HAL库 访问内部flash空间

Stm32 HAL库 访问内部flash空间 代码的部分串口配置申明文件main函数 在一些时候&#xff0c;需要存储一些数据&#xff0c;但是又不想接外部的flash&#xff0c;那我们可以知道&#xff0c;其实还有内部的flash可以使用&#xff0c; 需要注意的是内部flash&#xff0c;读写次数…

2024/4/1—力扣—BiNode

代码实现&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/void convertBiNode_pro(struct TreeNode *root, struct TreeNode **p) {if (root) {convertBiNode_pro(roo…

数据恢复与数据取证的便携工具:PC-3000 Portable III

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复同行&#xff0c;提供实验室建设方案&#xff0c;包含数据恢复与数据取证硬件…

GaN肖特基势垒二极管(SBD)的多阴极应用建模与参数提取

GaN Schottky Barrier Diode (SBD) Modeling and Parameter Extraction for Multicathode Application&#xff08;TED 24年&#xff09; 摘要 本文提出了一种适用于多阴极应用的紧凑型可扩展GaN肖特基二极管大信号模型。详细给出了外在和内在模型参数的可扩展规则。实验和理…

Java常用API_正则表达式_字符串的替换和截取方法——小练习

我将通过一个练习题来展示这两个方法 练习题&#xff1a; 有一段字符串&#xff1a;小张qwertyuiop123小李asdfghjkl456小王 要求1&#xff1a;把字符串中三个姓名之间的字母替换成vs 要求2&#xff1a;把字符串中的三个姓名切割出来 编写代码&#xff1a; public class Tes…

NRP-Z11罗德与施瓦茨NRP-Z11功率探头

181/2461/8938产品概述&#xff1a; R&S NRP-Z11、R&S NRP-Z21、R&S NRP-Z22、R&S NRP-Z23 和 R&S NRP-Z24 功率传感器将多路径架构、多二极管技术和同步扫描多通道测量系统融合为独特的高性能概念。多路径架构意味着组合两个或三个二极管检波器以获得调制…

Mysql--select语句

1.SQL概述 1.1SQL分类 SQL语言在功能上主要分为如下3大类&#xff1a; DDL&#xff08;Data Definition Languages、数据定义语言&#xff09;: 这些语句定义了不同的数据库、表、视图、索 引等数据库对象&#xff0c;还可以用来创建、删除、修改数据库和数据表的结构。 主要…

性能分析--内存知识

内存相关知识 计算机中与CPU进行数据交换的桥梁。内存的速度&#xff0c;比CPU的速度要慢很多。比磁盘速度要快很多。内存中存放数据&#xff0c;一旦断电就会消失。linux系统的 /proc路径下的文件&#xff0c;都是内存文件。内存大小&#xff0c;一般 是GB为单位。 现在都操作…

IDEA 导出jar无法执行 错误: 找不到或无法加载主类

1、首先配置正确Project Struct 保证需要引用的jar包库添加到Libraries里&#xff0c;尽管添加到Modules里依然可以测试运行或调试&#xff0c;但导出的jar包会遇到问题。 2、导出jar&#xff0c;方式选择如下 选择”From modules with dependencies" 然后去掉以上“Extr…

OpenCV 使用freetype在图像上写中文

​​​​​​ #include "opencv2/opencv.hpp" #include "opencv2/freetype.hpp"static cv::Ptr<cv::freetype::FreeType2> getFreeType() {static cv::Ptr<cv::freetype::FreeType2> ft2;if (ft2.empty()){ft2 cv::freetype::createFreeType…

说说虚拟化上部署Oracle RAC的那点注意事项

0.概述 目前在虚拟化上部署RAC主要是以下3个场景 1是VMWARE的虚拟化&#xff08;私有云&#xff09;&#xff1b; 2是国产厂商基于KVM的虚拟化&#xff08;私有云&#xff09;&#xff1b; 3是公有云&#xff0c;由云厂商给你提供虚拟主机和虚拟磁盘。 这里我只对前2个熟悉一些…