需求分析
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。