将第三方库打包成Android可用的so动态库
- protobuf
cd protobuf-3.14.0/
#export ndk_root=/home/tang/Documents/protobuf/android-ndk-r21b
export ndk_root=/home/tang/Android/Sdk/ndk/21.3.6528147
cmake \
-Dprotobuf_BUILD_SHARED_LIBS=ON \
-Dprotobuf_BUILD_STATIC_LIBS=ON \
-DCMAKE_VERBOSE_MAKEFILE=ON \
-Dprotobuf_BUILD_TESTS=OFF \
-Dprotobuf_BUILD_EXAMPLES=OFF \
-DCMAKE_TOOLCHAIN_FILE=$ndk_root/build/cmake/android.toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=lib \
-DANDROID_NDK=$ndk_root \
-DANDROID_TOOLCHAIN=clang \
-DANDROID_ABI=arm64-v8a \
-DANDROID_NATIVE_API_LEVEL=23 \
-DANDROID_STL=c++_shared \
-DANDROID_LINKER_FLAGS="-landroid -llog" \
-DANDROID_CPP_FEATURES="rtti exceptions" \
./cmake
make
编译arm64-v8a架构动态库脚本:
cd fftw-3.3.9/
export NDK_DIR="/home/xy/Android/Sdk/ndk/22.0.7026061"
export SYS_ROOT="$NDK_DIR/platforms/android-21/arch-arm64/"
export INSTALL_DIR="`pwd`/build"
export CC="aarch64-linux-android-gcc-4.9 --sysroot=$SYS_ROOT"
export LD="aarch64-linux-android-ld"
export AR="aarch64-linux-android-ar"
export RANLIB="aarch64-linux-android-ranlib"
export STRIP="aarch64-linux-android-strip"
export CFLAGS="-march=armv8-a"
mkdir -p $INSTALL_DIR
sudo ./configure --host=aarch64-linux-android
--prefix=$INSTALL_DIR
LIBS="-lc -lgcc"
--enable-shared
--enable-float
sudo make
sudo make install
编译armeabi-v7a :
cd fftw-3.3.9/
export NDK_DIR="/home/xy/Android/Sdk/ndk/22.0.7026061"
export SYS_ROOT="$NDK_DIR/platforms/android-21/arch-arm/"
export INSTALL_DIR="`pwd`/build"
export CC="arm-linux-androideabi-gcc-4.9 --sysroot=$SYS_ROOT"
export LD="arm-linux-androideabi-ld"
export AR="arm-linux-androideabi-ar"
export RANLIB="arm-linux-androideabi-ranlib"
export STRIP="arm-linux-androideabi-strip"
export CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon -fno-builtin-memmove -mthumb"
mkdir -p $INSTALL_DIR
sudo ./configure --host=arm-linux-androideabi --prefix=$INSTALL_DIR LIBS="-lc -lgcc" --enable-shared --enable-float
sudo make
sudo make install
链接FFTW
将fftw3.h复制到项目中
cmake_minimum_required(VERSION 3.16) # 设置Cmake最低版本
project(test) # 项目的名字
set(CMAKE_CXX_STANDARD 11) # 指定C++版本
target_include_directories(test
fftw3
)
target_link_libraries(test
fftw3
)
链接dlib
cmake_minimum_required(VERSION 3.16) # 设置Cmake最低版本
project(test) # 项目的名字
set(CMAKE_CXX_STANDARD 11) # 指定C++版本
find_package(dlib REQUIRED) # 寻找dlib
target_include_directories(test PUBLIC
dlib::dlib
)
target_link_libraries(test
dlib::dlib
)
链接protobuf
cmake_minimum_required(VERSION 3.16) # 设置Cmake最低版本
project(test) # 项目的名字
set(CMAKE_CXX_STANDARD 11) # 指定C++版本
find_package(Protobuf REQUIRED) # 寻找Protobuf
if(PROTOBUF_FOUND)
message(STATUS "protobuf library found")
else()
message(FATAL_ERROR "protobuf library is needed but cant be found")
endif()
include_directories(${PROTOBUF_INCLUDE_DIRS})
target_include_directories(test PUBLIC
${PROTOBUF_INCLUDE_DIRS} # 包含protobuf头文件
)
target_link_libraries(test
${PROTOBUF_LIBRARIES} # 链接protobuf
)
链接opencv
cmake_minimum_required(VERSION 3.16) # 设置Cmake最低版本
project(test) # 项目的名字
set(CMAKE_CXX_STANDARD 11) # 指定C++版本
# for mac
#set(OpenCV_DIR /usr/local/Cellar/opencv/4.5.0_5)
find_package(OpenCV REQUIRED) # 寻找OpenCV
target_include_directories(test PUBLIC
${OpenCV_INCLUDE_DIRS} # 包含OpenCV头文件
)
target_link_libraries(test
${OpenCV_LIBS} # 链接opencv
)
cmake 编译Release版本:
cmake .. -DCMAKE_BUILD_TYPE=Release
make
基本语法
cmake_minimum_required(VERSION 3.4.1)
#添加native-lib库
add_library(
native-lib
SHARED
src/main/cpp/native-lib.cpp )
#相关的头文件路径
include_directories(src/main/cpp/include/)
#添加NDK API 包含NDK库,可以使用其中任何API
#提供使用的库的名称,将其与自己的原生库相关联
find_library(
log-lib
log )
#使自己的原生库能够调用log库的函数,将NDK库和自己的库关联
target_link_libraries(
native-lib
${log-lib} )
#将源代码编译到原生库中
add_library( app-glue
STATIC
${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )
target_link_libraries(
native-lib
app-glue
${log-lib} )
#添加其他预构建库,只是将此库导入到项目中去
add_library( imported-lib
SHARED
IMPORTED )
#指定库的路径
set_target_properties(
imported-lib
PROPERTIES IMPORTED_LOCATION
imported-lib/src/${ANDROID_ABI}/libimported-lib.so )
#定位头文件并包含
include_directories( imported-lib/include/ )
#将预构建库关联到自己的原生库
target_link_libraries( native-lib imported-lib app-glue ${log-lib} )
#包含其他CMake项目
set( lib_src_DIR ../gmath )
set( lib_build_DIR ../gmath/outputs )
file(MAKE_DIRECTORY ${lib_build_DIR})
add_subdirectory(
${lib_src_DIR}
${lib_build_DIR} )
add_library( lib_gmath STATIC IMPORTED )
set_target_properties( lib_gmath PROPERTIES IMPORTED_LOCATION
${lib_build_DIR}/${ANDROID_ABI}/lib_gmath.a )
include_directories( ${lib_src_DIR}/include )
target_link_libraries( native-lib ... lib_gmath )
将example.cpp生成.so文件
将需要开放调用的方法用extern “C”{}括起来
add_library(test SHARED src/example.cpp)
find_package(OpenCV REQUIRED COMPONENTS core videoio)
target_include_directories(test PUBLIC
${OpenCV_INCLUDE_DIRS}
)
target_link_libraries(test
${OpenCV_LIBS}
)
链接第三方SO库
cmake_minimum_required(VERSION 2.8.12)
PROJECT (main)
# 可执行文件,执行main.c
ADD_EXECUTABLE(main main.c)
# 链接头文件
INCLUDE_DIRECTORIES(/usr/include/hello)
# 静态链接库
# TARGET_LINK_LIBRARIES(main libhello.a)
# 动态链接库
set(LINK_DIR /usr/local/lib)
link_directories(${LINK_DIR})
target_link_libraries(main libhello.so)