之前接触过使用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 目录下(解压的目录不局限于这个)

 

#unzip android-ndk-r14b-linux-x86_64.zip

(3)配置NDK,编辑/etc/profile,添加NDK路径。

 

 

# vim /etc/profileexport ANDROID_NDK_HOME=/usr/android/android-ndk-r14bexport 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脚本(CMakelists.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/bashrm -rf CMakeCache.txtrm -rf CMakeFilesrm -rf cmake_install.cmakerm -rf Makefilerm -rf CTestTestfile.cmakeif [[ “[email protected]“ =~ "-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.txtrm -rf CMakeFilesrm -rf cmake_install.cmakerm -rf Makefilerm -rf CTestTestfile.cmake

5. 编译

 

        将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脚本(CMakelists.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/bashrm -rf CMakeCache.txtrm -rf CMakeFilesrm -rf cmake_install.cmakerm -rf Makefilerm -rf CTestTestfile.cmakeif [[ “[email protected]“ =~ "-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.txtrm -rf CMakeFilesrm -rf cmake_install.cmakerm -rf Makefilerm -rf CTestTestfile.cmake


5. 编译

 

        将CMake脚本和Shell脚本放在同一目录下,赋予ShellScript执行权限,执行./ShellScript命令,生成的.so文件在指定生成目录下。

 

 

 

更多相关文章

  1. 在windows上编译jrtplib 3.9.1和jthread 1.3.1
  2. android 使用aapt方法
  3. iOS自动化测试(一)-技术方案、环境配置与疯狂踩坑
  4. 阿里云播放器调试心得,android的学习笔记
  5. 给自己的android扫盲文 - 1
  6. H5无法调起android app 的坑之 scheme 大小写
  7. JNI和NDK学习(1)--搭建开发环境
  8. Android应用程序的编译流程及使用Ant编译项目的攻略
  9. Android平台调用so库中函数的流程及一些坑

随机推荐

  1. Android(安卓)- 自定义Dialog内部透明,外
  2. Android默认USB为host模式
  3. Android(安卓)AsyncTask异步实现大文件下
  4. Android(安卓)SDK not found 的解决方案
  5. 【Android】glide:3.7.0->4.8.0 升级导入
  6. Settings中蓝牙连接流程
  7. Android(安卓)Notification的使用
  8. Looper源码探究—Android消息机制
  9. LIstview的使用和数据填充
  10. Android(安卓)UI开发专题(四) View自绘控