C++/Java调用C++动态链接库————附带示例和详细讲解

2023-05-16

文章目录

  • 0 准备
  • 1 C++调用动态链接库
  • 2 Java调用C++动态链接库
  • 3 运行

0 准备

在CMake中,使用如下的方法把代码编译成动态/静态链接库:

# 设置项目名 
project(getMatInfo)

# 设置c++版本
set(CMAKE_CXX_STANDARD 11)

 # 如果不填写SHARE,默认为静态链接库,或者把SHARED替换为STATIC
 add_library(getMatInfo SHARED
        getMatInfo.h
         getMatInfo.cpp)

各个平台的动态或静态链接库的格式,mac环境下的都是.dylib,在linux上为.so/.a文件,在windows上为.dll/.lib
在这里插入图片描述

注意在编译之前,需要在头文件中声明后面动态链接库函数中需要被调用的函数。例如,如下就是getMatInfo.h头文件中的内容:

#ifndef GETMATINFO_GETMATINFO_H
#define GETMATINFO_GETMATINFO_H


extern "C"{
void getMatInfo(const char* path, const char* variableName,int& row, int& col);
};

#endif //GETMATINFO_GETMATINFO_H

1 C++调用动态链接库

调用方法如下:

  • 1,把头文件getMatInfo.h放在和调用函数的同级目录下;
  • 2,在CMakeLists.txt中添加动态链接库的路径LINK_LIBRARIES("/Users/mac/CLionProjects/testlib/libgetMatInfo.dylib")【根据自己的情况做具体修改】;
  • 3,像正常调用方法一样调用动态链接库中的方法,例如下面的代码;
#include <iostream>
#include "getMatInfo.h"

int main() {

    const char *path = "/Users/mac/CLionProjects/getMatInfo/ranking.mat";
    const char* variableName = "Data"; //FigData
    int n = 0;
    int m = 0;
    getMatInfo(path, variableName, n, m);
    std::cout << n << " " << m;
    }

2 Java调用C++动态链接库

常见Java调用C++的代码方法有jni、jna、JNative。jni需要先编写Java代码,然后转换成C++代码,被调用的C++代码再去实现Java转转后的C++方法。虽然效率最高,但是比较麻烦。

这里使用是jna调用C++中的方法,原因就是不用改写C++的代码,相对简单一些。不过这个需要被调用的C++方法,改写对应的的数据结构,以便Java调用。
常见的数据结构映射如下:

请添加图片描述
指针对应的映射:
在这里插入图片描述
这里使用的库为:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

在这里插入图片描述
在IDEA中导入库的方法如下:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

首先,继承Library,然后定义载入动态链接库的变量,声明调用的接口:

package com.jk.jnaTest;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public interface JnaDll extends Library {

        JnaDll jnadll = (JnaDll) Native.load("/Users/mac/Downloads/springCloud/testLib/src/com/jk/jnaTest/libgetMatInfo.dylib", JnaDll.class);
        
    void getMatInfo(String path, String varName,IntByReference row, IntByReference col);

}

调用动态链接库的方法:

package com.jk.jnaTest;

public class JnaTest {
    public static void main(String[] args){
        IntByReference row = new IntByReference();
        IntByReference col = new IntByReference();

        String matPath = "/Users/mac/Downloads/springCloud/testLib/src/com/jk/jnaTest/Fig.mat";
        String varName = "FigData";
        JnaDll.jnadll.getMatInfo(matPath, varName,row, col);
        
        System.out.println(row.getValue());//纬度
        System.out.println(col.getValue());//个数

        System.out.println("testJna");
    }
}

3 运行

如果是在Linux下,不实用开发集成环境,直接使用JDK自带的指令进行编译和运行。

编译(两个jna的包的路径需要存在):

javac -cp .:/code/testLib/src/com/jk/jnaTest/jna-5.11.0.jar:/code/testLib/src/com/jk/jnaTest/jna-platform-5.11.0.jar -d . /code/testLib/src/com/jk/jnaTest/*.java

运行(进入到/code/testLib/src/com/jk/jnaTest/路径中):

java -cp .:/code/testLib/src/com/jk/jnaTest/jna-5.11.0.jar:/code/testLib/src/com/jk/jnaTest/jna-platform-5.11.0.jar com.jk.jnaTest.JnaTest

如果是使用编译器,那么需要打包成jar包,然后放到Linux服务器上进行执行:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++/Java调用C++动态链接库————附带示例和详细讲解 的相关文章

  • rk3399下pwm驱动

    现在记录一下rk3399下pwm的驱动编写 xff0c 下面是内核pwm的API xff0c 从开源论坛复制 xff08 firefly的开源论坛里面的Wiki教程 xff09 1 在要使用 PWM 控制的设备驱动文件中包含以下头文件 xf
  • rk3399下spi驱动

    SPI 使用 Note xff1a 本文从firefly wiki截取 SPI是一种高速的 xff0c 全双工 xff0c 同步串行通信接口 xff0c 用于连接微控制器 传感器 存储设备等 Firefly RK3399 开发板提供了 SP
  • rk3399 u-boot修改开机logo以及开机动画和开机视频

    首先分析了一下uboot启动流程中的一部分代码 xff0c 如下 第一部分 xff1a 开机logo xff08 下面代码分析排版有点乱 xff0c 可以忽略 xff09 1 board late init rk33xx c board r
  • VMware 虚拟网卡防火墙问题

    看了很多人遇到过一段时间会自己删除虚拟网卡的问题 xff0c 这里做一个补充 xff0c 关于防火墙问题 xff0c 如下 这里点进去 点击更改设置 xff08 先找到下图这一项 xff09 最后记得保存更改 xff0c 关于VMware的
  • postman汉化包下载

    postman汉化包 https github com hlmd Postman cn releases postman官网下载地址 Download Postman Get Started for Free
  • 一帧数据接收方法

    最近在做485数据通讯 xff0c 遇到一些通讯问题 xff0c 特意去查找资料 xff0c 一帧数据接收有三种方法 xff0c 现分享如下 xff1a 第一种方法 xff1a 根据帧头和帧尾进行校验 xff0c 串口发送2字节例如 xff
  • 如何使用RTKLIB进行RTK定位(一)

    今天从这个demo xff0c 教给大家如何使用RTKLIB进行RTK定位 xff0c 包括配置文件 数据等 xff1b RTKLIB源码和exe下载地址 xff1a RTKLIB An Open Source Program Packag
  • C++ “::” 作用域符 双冒号

    一 是作用域符 xff0c 是运算符中等级最高的 xff0c 它分为三种 1 global scope 全局作用域符 xff09 xff0c 用法 xff08 name 2 class scope 类作用域符 xff09 xff0c 用法
  • OpenMv测距(Apriltag)

    利用OpenMv测离Apriltag的距离 xff08 其他色块啥的算法都差不多 xff0c 主要是Apriltag精确一些 xff09 span class token comment 本次利用OpenMv单目测距Apriltag离摄像头
  • CMake Error at /usr/lib/x86_64-linux-gnu/cmake/Qt5Core/Qt5CoreConfig.cmake:27 (message)

    CMake Error at usr lib x86 64 linux gnu cmake Qt5Core Qt5CoreConfig cmake 27 message 在catkin make的时候 xff0c 如果提示 so文件报错 x
  • Deep-Sort多目标追踪算法代码解析

    Deep SORT是多目标跟踪 Multi Object Tracking 中常用到的一种算法 xff0c 是一个Detection Based Tracking的方法 这个算法工业界关注度非常高 xff0c 在知乎上有很多文章都是使用了D
  • 红黑树的查找时间复杂度O(logn)

    红黑树查找时间复杂度 如果二叉排序树是平衡的 xff0c 则n个节点的二叉排序树的高度为Log2n 43 1 其查找效率为O Log2n xff0c 近似于折半查找 如果二叉排序树完全不平衡 xff0c 则其深度可达到n xff0c 查找效
  • Ubuntu16.04环境下STM32和ROS间的串口通信

    目录 前言介绍 lt 1 gt 最终协议的样子 lt 2 gt 本方案提供的API实现的功能 原理 lt 1 gt 简要叙述 lt 2 gt 这里是如何使用共用体的 xff1f 前期准备 lt 1 gt 确保硬件连接 lt 2 gt 查看串
  • C++版本OpenCv教程(三十五 )Laplacian算子

    上述的边缘检测算子都具有方向性 xff0c 因此需要分别求取X方向的边缘和Y方向的边缘 xff0c 之后将两个方向的边缘综合得到图像的整体边缘 Laplacian算子具有各方向同性的特点 xff0c 能够对任意方向的边缘进行提取 xff0c
  • 【从零开始学深度学习编译器】五,TVM Relay以及Pass简介

    TVM Relay以及Pass简介 0x0 介绍0x2 Relay介绍0x2 1 使用Relay建立一个计算图0x2 2 Module xff1a 支持多个函数 xff08 Graphs xff09 0x2 3 Let Binding an
  • 模型量化的原理与实践 —基于YOLOv5实践目标检测的PTQ与QAT量化

    这里写自定义目录标题 一 量化基础知识 1 1 Tops是什么意思 1 2 什么是定点数 1 3 定点数转换 1 4 什么是量化 1 5 定点计算 1 5 1 定点计算 误差计算 1 5 2 定点计算 内存对比 1 5 3 定点计算 速度对
  • TensorRT INT8量化说明文档

    TensorRT developer guide intro quantization 7 Working with INT8 7 1 Introduction to Quantization 7 1 1 Quantization Work
  • YOLO-NAS讲解

    Meet YOLO NAS New YOLO Object Detection Model Beats YOLOv6 amp YOLOv8 代码链接 What is YOLO NAS What does the NAS in YOLO NA
  • Windows下jupyter notebook的安装和使用

    1 安装 xff1a xff08 1 xff09 首先打开Windows命令终端 xff1a 输入命令 xff1a pip install jupyter notebook 慢慢等待安装完成就可以了 我的是已经是安装完成了 在命令行窗口中输
  • 无人驾驶模型预测控制carSIM和MATLAB联合仿真

    本例参照龚建伟的 无人驾驶车辆模型预测控制 书中第四章节 1 carSIM软件介绍 carSIM是由美国MSC公司开发的车辆动力学仿真软件 xff0c 它可以方便灵活地定义实验环境和试验过程 xff0c 准确预测和仿真汽车的操纵稳定性 动力

随机推荐