需求分析

Java应用中需要调用C++的程序,而这个C++的程序中需要引入一个第三方静态库。所以需要将该程序编译成一个动态库文件(.so)供Java调用。

步骤

  • 使用CLion创建一个动态库的项目,会自动生成头文件,源文件和Cmake文件。

  • 头文件在使用so文件的时候也要用到,里面包含源文件中所有函数签名。
  • 源文件有具体的函数,也就是在这里调用第三方库的一些函数封装成一个新的函数。
  • Cmake文件用来编译成so动态库文件,主要有以下几个部分。
cmake_minimum_required(VERSION 3.15)
project(sealNative)
set(CMAKE_CXX_STANDARD 14)
find_package(SEAL 3.4.5 EXACT REQUIRED)
link_libraries(SEAL::seal)
add_library(sealNative SHARED library.cpp library.h)

其中最重要的就是后面三行,简单来说,find_package是找到依赖库,就是这里的第三方静态库libseal.a,然后link_libraries是把这个静态库链接到项目中,如果项目是可执行文件的项目,这里就改成target_link_libraries,最后add_library是指要生成so动态库文件。

  • 在Clion中Build->Build Project即可。
  • 写一个测试的源文件test.cpp
#include <iostream>
//引入动态库对应的头文件
#include <library.h>
using namespace std;
int main(){
//动态库中的方法,其中调用了第三方库
generateKey();
return 0;
}
  • 把生成的.so文件复制到/usr/lib/下,把头文件复制到test.cpp同目录下。
  • g++ -o test test.cpp -L./ -lsealNative && ./test,如果能正确执行方法,说明没问题,其中的-lsealNative需要根据生成的动态库的名称决定,这里的动态库文件全名是libsealNative.so。

github地址

https://github.com/Zeng1998/sealNative

【C++】将调用第三方库的代码封装成动态库供上层调用的更多相关文章

  1. C# 将 WebService 封装成动态库

    C# 将 WebService 封装成动态库 服务与服务之间的远程调用,经常会通过Web Service来实现,Web Service是支持跨语言调用的,可以是java调用c++或c#调用java等, ...

  2. 54.Qt-将界面程序封装成动态库DLL

    1.生成dll 然后选择创建共享库: 创建好后,修改pro文件,改为下面两句(这样就可以创建界面了):  然后修改sharedlib.h: #ifndef SHAREDLIB_H #define SH ...

  3. faster_rcnn c++版本的 caffe 封装,动态库(2)

    摘要: 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ github上的代码链接,求给星星:) https:// ...

  4. Android导入第三方静态库.a编译成动态库.so

    http://ikinglai.blog.51cto.com/6220785/1324985 在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库.如果有源码的话,可以直接跟你自己 ...

  5. 将自己写的HDL代码封装成带AXI总线的IP

    将自己写的HDL代码封装成带AXI总线的IP 1.Tools->create and package IP 2.create AXI4总线的IP 3.新建block design 4.点击右键, ...

  6. python 日志的配置,python对日志封装成类,日志的调用

    # python 日志的配置,python对日志封装成类,日志的调用 import logging # 使用logging模块: class CLog: # --------------------- ...

  7. 表格树控件QtTreePropertyBrowser编译成动态库(设计师插件)

    目录 一.回顾 二.动态库编译 1.命令行编译动态库和测试程序 2.vs工具编译动态库和测试程序 3.安装文档 4.测试文档 三.设计师插件编译 1.重写QDesignerCustomWidgetIn ...

  8. 将pugixml库编译成动态库的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 pugixml库默认是编译成静态库的.要把pugixml库编译成一个动态库,需要对代码做一些修改,具体是将 // If ...

  9. 如何将Js代码封装成Jquery插件

    很多相同的Jquery代码会在很多页面使用,每次都复制粘贴太麻烦了,不如封装成一个Jquery插件就方便了,至于影响网页的速度不,我就没有测试了哈. 代码如下 这是一个自定闪烁打印文字的Jquery特 ...

随机推荐

  1. AIDL基本用法

    1. AIDL有什么用?用TA到目的是什么? 2. 怎么用AIDL? 1. AIDL有什么用? 1.1. 为了提高代码执行速度,将部分逻辑封入C/C++代码中  1.2. 为了调用这部分代码,使用JN ...

  2. LeetCode Weekly Contest 6

    leetcode现在每周末举办比赛,这是今天上午参加的比赛的题解.题目难度不算大,两个easy,一个medium,一个hard.hard题之前接触过,所以做得比较顺利. 1.  Sum of Left ...

  3. Simpson公式的应用(HDU 1724/ HDU 1071)

    辛普森积分法 - 维基百科,自由的百科全书 Simpson's rule - Wikipedia, the free encyclopedia 利用这个公式,用二分的方法来计算积分. 1071 ( T ...

  4. vue项目配置同一局域网可使用ip访问

    1.检查 package.json文件,scripts.dev设置 host改成 "0.0.0.0" 2.config文件中找到 index.js 文件的host改成 " ...

  5. display:flex; justify-content:space-between; 最后一行显示内容无法靠左显示

    给父元素添加同每行展示列数一样(展示列表最多的)的子元素. 子元素设置样式: width:同子元素一样的width : height:0;

  6. 第二次 C++作业

    1.为什么要用函数? 函数是相对独立的,经常使用的功能抽象化表现形式,函数的优势在于,编写之后可以被重复使用,使用时可以只关心函数的功能和使用方法而不必关心函数的具体实现,这样可以有利于代码重用,可以 ...

  7. SuperSocket 服务器管理器 (ServerManager)

    SuperSocket服务器管理器文档 客户端安全证书验证 在 TLS/SSL 安全通信中, 客户端的安全证书不是必需的, 但是有些系统需要更高级别的安全保障. 因此有些用户提出了在服务器端验证客户端 ...

  8. 54个提高PHP程序运行效率的方法

    1.在可以用file_get_contents替代file.fopen.feof.fgets等系列方法的情况下,尽量用 file_get_contents,因为他的效率高得多!但是要注意file_ge ...

  9. typescript基础语法--变量/函数/指令/类

    博客地址 :https://www.cnblogs.com/sandraryan/ 要把ts文件引入到html中,首先要转码为js文件. 步骤: 终端运行: npm i -g typescript t ...

  10. win10访问Microsoft数据库问题总结

    今天突然接到任务 把15年的一个wpf项目倒腾出来,根据客户要求微调界面效果 翻扯项目历史记录,找到最后一版的项目,不过历经三载,开发时的环境和现在的环境略有差距 原来:win7 64位   vs20 ...