一、NDK環境配置
1、下載android-ndk-r20-linux-x86_64.zip
2、inux下解壓android-ndk-r14b-linux-x86_64.zip壓縮包到 /usr/android 目錄下(路徑可自定義)
unzip -d /usr/android android-ndk-r20-linux-x86_64.zip
3、配置環境變量,編輯/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,使配置生效(注意:fish不支持source喲)
#source /etc/profile
二、cmake工具鏈配置
可以使用NDK自帶的工具鏈android.toolchain.cmake(在目錄android-ndk-r16-linux-x86_64\android-ndk-r16\build\cmake下)
三. 編譯
將CMake腳本和Shell腳本放在同一目錄下,賦予ShellScript執行權限,執行./ShellScript命令,生成的.so文件在指定生成目錄下。
附一、CMakelists.txt:
#****************************This is Project Info****************************
#PROJECT(avxallocate)
PROJECT(xccitybus)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12)
#****************************This is Compile Flag****************************
if(HOST_NAME MATCHES linux)
message( STATUS "==============================linux debug==============================" )
SET(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
elseif((HOST_NAME MATCHES android))
if(DEBUG)
message( STATUS "==============================android debug==============================" )
ADD_DEFINITIONS(-g)
ADD_DEFINITIONS(-D AVX_DEBUG_LEVEL=AVX_DEBUG_DEBUG)
else(DEBUG)
message( STATUS "==============================android release==============================" )
ADD_DEFINITIONS(-O2)
ADD_DEFINITIONS(-D AVX_DEBUG_LEVEL=AVX_DEBUG_INFO)
endif()
endif()
#ADD_DEFINITIONS("-Wall")
#ADD_DEFINITIONS("-fPIC")
#ADD_DEFINITIONS("-Wl,-lm")
#ADD_DEFINITIONS("-std=gnu++11")
#add_definitions(-Wformat=0)
#ADD_DEFINITIONS(-Wpointer-sign)
#ADD_DEFINITIONS(-Wunused-variable)
#ADD_DEFINITIONS(-Wimplicit-function-declaration)
#ADD_DEFINITIONS(-Wformat=0)
#ADD_DEFINITIONS(-Wunused-label)
ADD_DEFINITIONS ("-w")
#ADD_DEFINITIONS ("-v") #輸出編譯器相關信息
SET(CMAKE_C_FLAGS "-fPIC -Wl,-Bsymbolic -lz -lm -lcurl -D__STDINT_LIMITS -D__STDINT_MACROS -D__ANDROID__ -DANDROID")
#****************************This is Include File/Directories****************************
set(inc_file_path_list
/src/inc)
foreach(inc_path_list ${inc_file_path_list})
INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR}${inc_path_list})
endforeach(inc_path_list)
#****************************This is Source File/Directories****************************
set(src_file_path_list
/src/src)
foreach(src_path_list ${src_file_path_list})
aux_source_directory(${PROJECT_BINARY_DIR}${src_path_list} DIR_SRCS)
endforeach(src_path_list)
#****************************This is Library Directories****************************
if(HOST_NAME MATCHES linux)
LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/src/lib/linux)
elseif((HOST_NAME MATCHES android))
LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/src/lib/android)
endif()
#****************************This is 3Party Library****************************
LINK_LIBRARIES(curl)
LINK_LIBRARIES(sql_exe)
LINK_LIBRARIES(ums)
#****************************This is Output Directory****************************
if(HOST_NAME MATCHES android)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/lib_android)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/lib_android)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/lib_android)
elseif((HOST_NAME MATCHES linux))
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/lib_linux)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/lib_linux)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/lib_linux)
endif()
#****************************This is Output Library****************************
ADD_LIBRARY(xccitybus SHARED ${DIR_SRCS} )
TARGET_LINK_LIBRARIES(xccitybus)
附二、ShellScript.sh
#!/bin/bash
rm -rf CMakeCache.txt
rm -rf CMakeFiles
rm -rf cmake_install.cmake
rm -rf Makefile
rm -rf CTestTestfile.cmake
if [[ $@ =~ "-linux" ]]
then
echo "----------------------------cmake linux debug----------------------------"
cmake -DHOST_NAME=linux -DDEBUG=ON
elif [[ $@ =~ "-d" ]]
then
echo "----------------------------cmake android debug----------------------------"
cmake -DHOST_NAME=android -DDEBUG=ON -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/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 android release----------------------------"
cmake -DHOST_NAME=android -DDEBUG=NO -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/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.cmake