0%

使用NDK和CMake进行交叉编译库

https://developer.android.com/ndk/guides/cmake?hl=zh-cn

https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-android-with-the-ndk

NDK 通过工具链文件支持 CMake。工具链文件是用于自定义交叉编译工具链行为的 CMake 文件。用于 NDK 的工具链文件位于 NDK 中的 /build/cmake/android.toolchain.cmake 内。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#/bin/bash

export ANDROID_NDK=/opt/env/android-ndk-r14b

rm -r build
mkdir build && cd build

cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="armeabi-v7a" \
-DANDROID_NDK=$ANDROID_NDK \
-DANDROID_PLATFORM=android-22 \
..

make && make install

cd ..

opencv NDK 编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_TOOLCHAIN_FILE=/Users/zauther/Library/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake \
-D ANDROID_TOOLCHAIN=clang \
-D PYTHON_DEFAULT_EXECUTABLE=$(python -c "import sys; print(sys.executable)") \
-D PYTHON3_EXECUTABLE=$(python -c "import sys; print(sys.executable)") \
-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python -c "import numpy; print (numpy.get_include())") \
-D PYTHON3_INCLUDE_PATH=/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Headers \
-D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-D PYTHON2_EXECUTABLE=/Users/zauther/Downloads/head_file/AliNNPython \
-D PYTHON2_NUMPY_INCLUDE_DIRS=/Users/zauther/Downloads/head_file \
-D PYTHON2_INCLUDE_PATH=/Library/Frameworks/Python.framework/Versions/2.7/Headers \
-D PYTHON2_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-D CMAKE_CXX_FLAGS="-std=c++11" \
-D CMAKE_C_FLAGS="-D__ANDROID_API__=26" \
-D ANDROID_NDK=/Users/zauther/Library/Android/sdk/ndk-bundle \
-D ANDROID_ABI="arm64-v8a" \
-D ANDROID_NATIVE_API_LEVEL=android-26 \
-D ANDROID_NO_UNDEFINED=ON \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_python2=ON \
-D ANDROID_SO_UNDEFINED=OFF \
-D DBUILD_SHARED_LIBS=ON \
-D ENABLE_SOLUTION_FOLDERS=ON \
../opencv/

make opencv_python2
make opencv_python3
ninja -j 8 # -GNinja \

需要使用android 24以上,https://android.googlesource.com/platform/bionic/+/master/libc/include/bits/fortify/unistd.h 中的__write_chk以来24以上的版本。

NDK编译问题

  • bionic/libc/include/bits/fortify/stdio.h:43: error

https://www.jianshu.com/p/9079766aa28c
问题是android不同版本支持的api有变动,需要使用高版本的android,api列表如下:
https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#available-in-api-level-23

  • ndk 编译工具链

一般位于NDK 中的 /build/cmake/android.toolchain.cmake 内。