使用NDK和CMake在Linux上编译Android动态库
2017-12-22 13:58
579 查看
之前接触过使用CMake编译IOS的项目,开始编译Android库时候,不是很熟悉Android.mk的编译方式,所以继续沿用CMake编译Android的库。使用gcc编译出来的库在Android stutio上使用时候App有些是可以直接用,但有些动态库会有一些奇奇怪怪的错误。所以换了最新版本的NDK,并采用clang编译,这下编译出来的库在Android stutio上使用是没有什么问题了。现将两种编译方式都总结如下,供大家参考。
一、android-ndk-r14b编译(gcc)
1. NDK环境配置
(1)下载android-ndk-r14b-linux-x86_64.zip
(2)linux下解压android-ndk-r14b-linux-x86_64.zip压缩包到 /usr/android 目录下(解压的目录不局限于这个)
2. cmake工具链
(1)下载android.toolchain.cmake
(2) 修改工具链android.toolchain.cmake,将1325行改为:
3. cmake脚本(CMakelist.txt)
4. Shell脚本(ShellScript)
将CMake脚本和Shell脚本放在同一目录下,赋予ShellScript执行权限,执行./ShellScript命令,生成的.so文件在指定生成目录下。
一、android-ndk-r16编译(clang)
1. NDK环境配置
和android-ndk-r14b配置步骤一样,下载地址为:android-ndk-r16-linux-x86_64.zip
2. cmake工具链
使用ndk自带的工具链android.toolchain.cmake(在目录android-ndk-r16-linux-x86_64\android-ndk-r16\build\cmake下)
3. cmake脚本(CMakelist.txt)
4. Shell脚本(ShellScript)
5. 编译
将CMake脚本和Shell脚本放在同一目录下,赋予ShellScript执行权限,执行./ShellScript命令,生成的.so文件在指定生成目录下。
一、android-ndk-r14b编译(gcc)
1. NDK环境配置
(1)下载android-ndk-r14b-linux-x86_64.zip
(2)linux下解压android-ndk-r14b-linux-x86_64.zip压缩包到 /usr/android 目录下(解压的目录不局限于这个)
#unzip android-ndk-r14b-linux-x86_64.zip(3)配置NDK,编辑/etc/profile,添加NDK路径。
# vim /etc/profile export ANDROID_NDK_HOME=/usr/android/android-ndk-r14b export PATH=$ANDROID_NDK_HOME:$PATH(4)输入命令 source /etc/profile,使配置生效。
#source /etc/profile
2. cmake工具链
(1)下载android.toolchain.cmake
(2) 修改工具链android.toolchain.cmake,将1325行改为:
set( ANDROID_LINKER_FLAGS "--sysroot=${ANDROID_SYSROOT}" )注:如果不添加"--sysroot=${ANDROID_SYSROOT}",可能会有编译错误:缺少crtbegin_so.o、crtend_so.o等。
3. cmake脚本(CMakelist.txt)
#****************************This is Project Info**************************** PROJECT(avxallocate) CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12) #****************************This is Compile Flag**************************** if(DEBUG) message( STATUS "==============================debug==============================" ) ADD_DEFINITIONS(-g) ADD_DEFINITIONS(-D AVX_DEBUG_LEVEL=AVX_DEBUG_DEBUG) else(DEBUG) message( STATUS "==============================release==============================" ) ADD_DEFINITIONS(-O2) ADD_DEFINITIONS(-D AVX_DEBUG_LEVEL=AVX_DEBUG_INFO) endif() ADD_DEFINITIONS("-Wall") ADD_DEFINITIONS("-fPIC") ADD_DEFINITIONS("-Wl,-lm") ADD_DEFINITIONS("-std=gnu++11") SET(CMAKE_CXX_FLAGS "-Wall -fPIC -Wl,-Bsymbolic -lm -D__STDINT_LIMITS -D__STDINT_MACROS -D__ANDROID__ -DANDROID") #****************************This is Include File/Directories**************************** #INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/) INCLUDE_DIRECTORIES(../../libextern/Android/include) #****************************This is Source File/Directories**************************** SET(DIR_SRCS ../AVXAllocate.cpp) #****************************This is Library Directories**************************** LINK_DIRECTORIES(./) LINK_DIRECTORIES(../../libextern/Android/lib) #****************************This is 3Party Library**************************** #LINK_LIBRARIES(pthread) #****************************This is Output Directory**************************** SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../../../bin/Android) SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../../../bin/Android) SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../../../bin/Android) #****************************This is Output Library**************************** ADD_LIBRARY(avxallocate SHARED ${DIR_SRCS} ) TARGET_LINK_LIBRARIES(avxallocate)
4. Shell脚本(ShellScript)
#!/bin/bash rm -rf CMakeCache.txt rm -rf CMakeFiles rm -rf cmake_install.cmake rm -rf Makefile rm -rf CTestTestfile.cmake if [[ “$@“ =~ "-d" ]];then echo "----------------------------cmake debug----------------------------" cmake -DDEBUG=ON -DCMAKE_TOOLCHAIN_FILE=../../bulid/Android/toolchain/android.toolchain.cmake \ -DANDROID_NDK=$ANDROID_NDK_HOME \ \ -DANDROID_ABI="armeabi-v7a" \ -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9\ -DANDROID_NATIVE_API_LEVEL=21\ -DANDROID_STL=gnustl_static\ . else echo "----------------------------cmake release----------------------------" cmake -DDEBUG=NO -DCMAKE_TOOLCHAIN_FILE=../../bulid/Android/toolchain/android.toolchain.cmake \ -DANDROID_NDK=$ANDROID_NDK_HOME \ \ -DANDROID_ABI="armeabi-v7a" \ -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9\ -DANDROID_NATIVE_API_LEVEL=21\ -DANDROID_STL=gnustl_static\ . fi make rm -rf CMakeCache.txt rm -rf CMakeFiles rm -rf cmake_install.cmake rm -rf Makefile rm -rf CTestTestfile.cmake5. 编译
将CMake脚本和Shell脚本放在同一目录下,赋予ShellScript执行权限,执行./ShellScript命令,生成的.so文件在指定生成目录下。
一、android-ndk-r16编译(clang)
1. NDK环境配置
和android-ndk-r14b配置步骤一样,下载地址为:android-ndk-r16-linux-x86_64.zip
2. cmake工具链
使用ndk自带的工具链android.toolchain.cmake(在目录android-ndk-r16-linux-x86_64\android-ndk-r16\build\cmake下)
3. cmake脚本(CMakelist.txt)
#****************************This is Project Info**************************** PROJECT(avxallocate) CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12) #****************************This is Compile Flag**************************** if(DEBUG) message( STATUS "==============================debug==============================" ) ADD_DEFINITIONS(-g) ADD_DEFINITIONS(-D AVX_DEBUG_LEVEL=AVX_DEBUG_DEBUG) else(DEBUG) message( STATUS "==============================release==============================" ) ADD_DEFINITIONS(-O2) ADD_DEFINITIONS(-D AVX_DEBUG_LEVEL=AVX_DEBUG_INFO) endif() #SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__ANDROID__ -DANDROID") #****************************This is Include File/Directories**************************** #INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/) INCLUDE_DIRECTORIES(../../libextern/Android/include) #****************************This is Source File/Directories**************************** SET(DIR_SRCS ../AVXAllocate.cpp) #****************************This is Library Directories**************************** LINK_DIRECTORIES(./) LINK_DIRECTORIES(../../libextern/Android/lib) #****************************This is 3Party Library**************************** #LINK_LIBRARIES(pthread) #****************************This is Output Directory**************************** SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../../../bin/Android) SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../../../bin/Android) SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/../../../bin/Android) #****************************This is Output Library**************************** ADD_LIBRARY(avxallocate SHARED ${DIR_SRCS} ) TARGET_LINK_LIBRARIES(avxallocate)
4. Shell脚本(ShellScript)
#!/bin/bash rm -rf CMakeCache.txt rm -rf CMakeFiles rm -rf cmake_install.cmake rm -rf Makefile rm -rf CTestTestfile.cmake if [[ “$@“ =~ "-d" ]];then echo "----------------------------cmake debug----------------------------" cmake -DDEBUG=ON -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \ -DANDROID_NDK=$ANDROID_NDK_HOME \ -DANDROID_ABI=armeabi-v7a \ -DANDROID_TOOLCHAIN=clang \ -DANDROID_PLATFORM=android-21 \ -DANDROID_STL=c++_shared \ . else echo "----------------------------cmake release----------------------------" cmake -DDEBUG=NO -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \ -DANDROID_NDK=$ANDROID_NDK_HOME \ -DANDROID_ABI=armeabi-v7a \ -DANDROID_TOOLCHAIN=clang \ -DANDROID_PLATFORM=android-21 \ -DANDROID_STL=c++_shared \ . fi make rm -rf CMakeCache.txt rm -rf CMakeFiles rm -rf cmake_install.cmake rm -rf Makefile rm -rf CTestTestfile.cmake
5. 编译
将CMake脚本和Shell脚本放在同一目录下,赋予ShellScript执行权限,执行./ShellScript命令,生成的.so文件在指定生成目录下。
相关文章推荐
- windows下使用cmake和ndk编译android所用动态库.so和静态库.a
- Android开发 NDK 编译和使用静态库、动态库 (转)
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- AndroidStudio2.2.3版本使用CMake编译NDK工程(ffmpeg)
- android开发 NDK编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- Android 使用CMake编译NDK(一)CMakeLists.txt
- Android 使用CMake 编译NDK
- NDK 编译和使用静态库、动态库; Android.mk 文件语法详解; Android.mk高级写法
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- android开发 NDK 编译和使用静态库、动态库
- 【ndk】直接使用ndk提供的arm-linux-androideabi-gcc编译android可执行程序
- window环境下使用ndk编译出android studio/Eclipse能使用的ffmpeg动态库
- android开发 NDK 编译和使用静态库、动态库
- 使用Android NDK内置编译器为Android编译Linux应用程序
- android开发 NDK 编译和使用静态库、动态库
- linux 下使用ndk-build编译android使用的c++静态库
- android开发 NDK 编译和使用静态库、动态库