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

news/2025/1/11 10:01:29/

文章目录

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

0 准备

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

# 设置项目名 
project(getMatInfo)# 设置c++版本
set(CMAKE_CXX_STANDARD 11)# 如果不填写SHARE,默认为静态链接库,或者把SHARED替换为STATICadd_library(getMatInfo SHAREDgetMatInfo.hgetMatInfo.cpp)

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

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

#ifndef GETMATINFO_GETMATINFO_H
#define GETMATINFO_GETMATINFO_Hextern "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"; //FigDataint 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服务器上进行执行:

在这里插入图片描述


http://www.ppmy.cn/news/6949.html

相关文章

Learning to Segment Every Thing

摘要 现有的目标实例分割方法要求所有训练样本都具有分割mask标注。然而&#xff0c;标注新的类别是非常费劲的&#xff0c;因此这将实例分割模型的应用范围限制在100个左右的有标注的类。本文的目的是提出一种新的部分监督的训练模型&#xff0c;以及一种新的权重传递函数&am…

TensorRt(3)mnist示例中的C++ API

目前sample中mnist提供了至少caffe、onnx的预训练模型&#xff0c;在TensorRT经过优化生成engine后再进行infer&#xff0c;两种模型的加载处理略有不同&#xff0c;做出简单api处理说明。 最后尝试使用最少的代码来实现整个流程。 文章目录1、主要的C API 定义2、minst示例2.1…

第二十六章 数论——欧拉函数(详解与证明)

第二十六章 数论——欧拉函数&#xff08;详解与证明&#xff09;欧拉函数1、互质2、欧拉函数的定义3、欧拉函数的公式4、欧拉函数的证明5、欧拉函数的使用&#xff08;1&#xff09;问题一&#xff1a;思路代码&#xff08;2&#xff09;问题二&#xff1a;思路case1case1case…

边缘AI概述

随着移动计算和物联网&#xff08;IoT&#xff09;应用程序的爆炸性增长&#xff0c;数十亿移动和物联网设备正在连接到互联网&#xff0c;在网络边缘生成大量数据。因此&#xff0c;在云数据中心收集大量数据会产生极高的延迟和网络带宽使用。 因此&#xff0c;迫切需要将人工…

USB TYPE C为什么能实现正反插

USB TYPE C接口在手机&#xff0c;电脑等移动终端中使用的非常多&#xff0c;它可以分为插头和插座&#xff0c;放在PCB板上一般是插座。 USB TYPE C的插座和插头引脚信号定义大家可以看下。引脚分为两排&#xff0c;上面一排是A&#xff0c;下面一排是B。标准的USB TYPE C总共…

Spring注册Bean系列--方法3:@Import+@Bean

原文网址&#xff1a;Spring注册Bean系列--方法3&#xff1a;ImportBean_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法&#xff1a;ImportBean。 注册Bean的方法我写了一个系列&#xff0c;见&#xff1a;Spring注册Bean(提供Bean)系列--方法大全_IT利刃出鞘…

canal中间件集成springboot实战落地

目录 一、数据库开启相关权限功能&#xff1a; 二、canal 服务端配置启动&#xff1a;从官网下载程序和源码到本地环境 三、canal客户端配置启动&#xff1a; canal中间件集成springboot实战落地开始分享&#xff0c;这是目前互联网很常见的中间件&#xff0c;监听数据库变化…

Android 10.0 修改LocalOnlyHotspot默认的SSID和密码

目录 1.概述 2.修改LocalOnlyHotspot默认的SSID和密码的核心代码 3.修改LocalOnlyHotspot默认的SSID