- 作業用のディレクトリを作成し、そこに移動し、以下を実行
cd dlib
mkdir tools/python/build
cd tools/python/build
- 設定のファイルの位置確認1
- もし無いなら、find ${HOME}/mydlib/.buildozer/ -iname python -type f で探し、cmakeするときのオプションの該当箇所を変更
ls ${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/hostpython3/desktop/hostpython3/native-build/python
- 設定のファイルの位置確認2
- もし無いなら、find ${HOME}/mydlib/.buildozer/ -iname Python.h -type f で探し、そのディレクトリを調べておく、cmakeするときのオプションの該当箇所を変更
ls ${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/Include
- 設定のファイルの位置確認3
- もし無いなら、find ${HOME}/mydlib/.buildozer/ -iname libpython3.8.so -type f で探し、そのディレクトリを調べておく、cmakeするときのオプションの該当箇所を変更
ls ${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/android-build/libpython3.8.so
- 以下のコマンドを実行,ただし、環境にあわせて、コマンド変更する必要あります。
- 前準備で用意した、Androidパッケージの開発ディレクトリが、下の例だと ${HOME}/mydlib/ になっています。このディレクトリじゃない場合は、前準備で行ったディレクトリに変更してください。
- Android用の開発環境はホームディレクトリの、Android/SDK ディレクトリ以下にインストール済み https://youtu.be/3U5_330aySk 。他のバージョンを利用する場合は、そこを変更してください。
- その他の設定について
- ndkは19系の作業時点で一番新しいバージョンを利用した。
- ターゲットは’arm64-v8a’にしている
- android.ndk_apiが21の場合。21以外なら、以下のコマンドの21をその番号に変更
- lsコマンドで事前に調べたオプションが環境にあってないなら、該当箇所を変更
- 2行目のコメントアウトしているコマンドは、2021/2/15現在で、python-for-android develp(githubで最新)を使う時のコマンド、Python関係のファイルの位置がちょっと違う
${HOME}/Android/SDK/cmake/3.10.2.4988404/bin/cmake -DANDROID_NDK="${HOME}/Android/SDK/ndk/19.2.5345600" -DCMAKE_TOOLCHAIN_FILE="${HOME}/Android/SDK/ndk/19.2.5345600/build/cmake/android.toolchain.cmake" -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI='arm64-v8a' -DANDROID_PLATFORM="android-21" -DANDROID_TOOLCHAIN=clang -DANDROID_CPP_FEATURES=rtti exceptions -DPYTHON_EXECUTABLE=${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/hostpython3/desktop/hostpython3/native-build/python -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=build/lib.arm64-v8a -DPYTHON_INCLUDE_DIRS=${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/Include -DPYTHON_LIBRARY=${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/android-build/libpython3.8.so .. 2>&1 | tee log001.txt
# ${HOME}/Android/SDK/cmake/3.10.2.4988404/bin/cmake -DANDROID_NDK="${HOME}/Android/SDK/ndk/19.2.5345600" -DCMAKE_TOOLCHAIN_FILE="${HOME}/Android/SDK/ndk/19.2.5345600/build/cmake/android.toolchain.cmake" -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI='arm64-v8a' -DANDROID_PLATFORM="android-21" -DANDROID_TOOLCHAIN=clang -DANDROID_CPP_FEATURES=rtti exceptions -DPYTHON_EXECUTABLE=${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/hostpython3/desktop/hostpython3/native-build/python -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=build/lib.arm64-v8a -DPYTHON_INCLUDE_DIRS=${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3-libbz2-liblzma/arm64-v8a__ndk_target_21/python3/Include -DPYTHON_LIBRARY=${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3-libbz2-liblzma/arm64-v8a__ndk_target_21/python3/android-build/libpython3.8.so .. 2>&1 | tee log001.txt # python-for-android develの場合こっちだった
make 2>&1 | tee log002.txt
- これを実行すると、コンパイルには成功しますが、リンクの時にエラーが出ます。以下のようなエラーならOK。100%までコンパイルできずにエラーになってたら、上のcmakeのオプションがまずいので、修正
... 省略
[100%] Linking CXX shared module build/lib.arm64-v8a/_dlib_pybind11.cpython-38-x86_64-linux-gnu.so
... 膨大なエラーメッセージ
- リンクで失敗しているので、そこの命令をマニュアルで実行します。
- CMakeFiles/_dlib_pybind11.dir/link.txt にリンク時のコマンドが生成されてるので、-L${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/android-build -lpython3.8 を追加します。私は-latomic の前に挿入しました。
- ユーザー名がyoutubeの時こんな感じ
/home/youtube/Android/SDK/ndk/19.2.5345600/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/home/youtube/Android/SDK/ndk/19.2.5345600/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/youtube/Android/SDK/ndk/19.2.5345600/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,--noexecstack -Wformat -Werror=format-security -stdlib=libc++ -frtti -O2 -DNDEBUG -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared -o build/lib.arm64-v8a/_dlib_pybind11.cpython-38-x86_64-linux-gnu.so CMakeFiles/_dlib_pybind11.dir/src/dlib.cpp.o CMakeFiles/_dlib_pybind11.dir/src/matrix.cpp.o CMakeFiles/_dlib_pybind11.dir/src/vector.cpp.o CMakeFiles/_dlib_pybind11.dir/src/svm_c_trainer.cpp.o CMakeFiles/_dlib_pybind11.dir/src/svm_rank_trainer.cpp.o CMakeFiles/_dlib_pybind11.dir/src/decision_functions.cpp.o CMakeFiles/_dlib_pybind11.dir/src/other.cpp.o CMakeFiles/_dlib_pybind11.dir/src/basic.cpp.o CMakeFiles/_dlib_pybind11.dir/src/cca.cpp.o CMakeFiles/_dlib_pybind11.dir/src/sequence_segmenter.cpp.o CMakeFiles/_dlib_pybind11.dir/src/svm_struct.cpp.o CMakeFiles/_dlib_pybind11.dir/src/image.cpp.o CMakeFiles/_dlib_pybind11.dir/src/image2.cpp.o CMakeFiles/_dlib_pybind11.dir/src/image3.cpp.o CMakeFiles/_dlib_pybind11.dir/src/image4.cpp.o CMakeFiles/_dlib_pybind11.dir/src/rectangles.cpp.o CMakeFiles/_dlib_pybind11.dir/src/object_detection.cpp.o CMakeFiles/_dlib_pybind11.dir/src/shape_predictor.cpp.o CMakeFiles/_dlib_pybind11.dir/src/correlation_tracker.cpp.o CMakeFiles/_dlib_pybind11.dir/src/face_recognition.cpp.o CMakeFiles/_dlib_pybind11.dir/src/cnn_face_detector.cpp.o CMakeFiles/_dlib_pybind11.dir/src/global_optimization.cpp.o CMakeFiles/_dlib_pybind11.dir/src/image_dataset_metadata.cpp.o CMakeFiles/_dlib_pybind11.dir/src/numpy_returns.cpp.o CMakeFiles/_dlib_pybind11.dir/src/line.cpp.o dlib_build/libdlib.a -latomic -lm
- -L${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/android-build -lpython3.8 を追加例が以下
/home/youtube/Android/SDK/ndk/19.2.5345600/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/home/youtube/Android/SDK/ndk/19.2.5345600/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/youtube/Android/SDK/ndk/19.2.5345600/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,--noexecstack -Wformat -Werror=format-security -stdlib=libc++ -frtti -O2 -DNDEBUG -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared -o build/lib.arm64-v8a/_dlib_pybind11.cpython-38-x86_64-linux-gnu.so CMakeFiles/_dlib_pybind11.dir/src/dlib.cpp.o CMakeFiles/_dlib_pybind11.dir/src/matrix.cpp.o CMakeFiles/_dlib_pybind11.dir/src/vector.cpp.o CMakeFiles/_dlib_pybind11.dir/src/svm_c_trainer.cpp.o CMakeFiles/_dlib_pybind11.dir/src/svm_rank_trainer.cpp.o CMakeFiles/_dlib_pybind11.dir/src/decision_functions.cpp.o CMakeFiles/_dlib_pybind11.dir/src/other.cpp.o CMakeFiles/_dlib_pybind11.dir/src/basic.cpp.o CMakeFiles/_dlib_pybind11.dir/src/cca.cpp.o CMakeFiles/_dlib_pybind11.dir/src/sequence_segmenter.cpp.o CMakeFiles/_dlib_pybind11.dir/src/svm_struct.cpp.o CMakeFiles/_dlib_pybind11.dir/src/image.cpp.o CMakeFiles/_dlib_pybind11.dir/src/image2.cpp.o CMakeFiles/_dlib_pybind11.dir/src/image3.cpp.o CMakeFiles/_dlib_pybind11.dir/src/image4.cpp.o CMakeFiles/_dlib_pybind11.dir/src/rectangles.cpp.o CMakeFiles/_dlib_pybind11.dir/src/object_detection.cpp.o CMakeFiles/_dlib_pybind11.dir/src/shape_predictor.cpp.o CMakeFiles/_dlib_pybind11.dir/src/correlation_tracker.cpp.o CMakeFiles/_dlib_pybind11.dir/src/face_recognition.cpp.o CMakeFiles/_dlib_pybind11.dir/src/cnn_face_detector.cpp.o CMakeFiles/_dlib_pybind11.dir/src/global_optimization.cpp.o CMakeFiles/_dlib_pybind11.dir/src/image_dataset_metadata.cpp.o CMakeFiles/_dlib_pybind11.dir/src/numpy_returns.cpp.o CMakeFiles/_dlib_pybind11.dir/src/line.cpp.o dlib_build/libdlib.a -L${HOME}/mydlib/.buildozer/android/platform/build-arm64-v8a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/android-build -lpython3.8 -latomic -lm
- このコマンドを実行すると、リンクして build/lib.arm64-v8a/_dlib_pybind11.cpython-38-x86_64-linux-gnu.so が生成されます。ファイル名はlinux用になっていますが、中身は arm64-v8a用(Android64bit用)のバイナリになっています。
- build/lib.arm64-v8a/以下のファイルが、必要ファイルになります。
- ファイルサイズが240M程度で大きいので、以下を行うと11M程度までファイルが小さくなります。
${HOME}/Android/SDK/ndk/19.2.5345600/toolchains/llvm/prebuilt/linux-x86_64/aarch64-linux-android/bin/strip ./build/lib.arm64-v8a/_dlib_pybind11.cpython-38-x86_64-linux-gnu.so
- あとは./build/lib.arm64-v8a/dlib/ディレクトリを、Dlibを使いたいbuildozerプロジェクトディレクトリにコピーします。
- コピー先のディレクトリ名は、各自変更してください。下の例だと ${HOME}/mydlib/ にインストールする場合
cp -r ./build/lib.arm64-v8a/dlib/ ${HOME}/mydlib/
- 必要な動的ライブラリをコピーします
- コピーする時にファイル名を変更しました。元のままでも動作するかどうかは未確認。ファイル名をもしかしたら、変更しなくても大丈夫かもしれない
- コピー先のディレクトリ名は、各自変更してください。下の例だと ${HOME}/mydlib/ にインストールする場合
cp ./build/lib.arm64-v8a/_dlib_pybind11.cpython-38-x86_64-linux-gnu.so ${HOME}/mydlib/_dlib_pybind11.cpython-38.so
- この例だと ${HOME}/mydlib/ の Dlibを使いたいbuildozerプロジェクトを、再度コンパイルしなおせば、そのパッケージでDlibをPythonから使えます。