概要
android ndk で ceres-solver をビルドし、liceres.a が欲しかった。
それをアプリケーションにnative build する際にリンクさせる必要があった。
ceres-solver バージョン確認
ceres-solver は様々なバージョンがあり、1.12, 1.13, 1.14, 2.0 系などがある。
それらをgithubのリリースから取得。
ndk バージョン確認
ndk download と検索し、ndk(現在は22系が正式サポートされていた)
の必要なバージョンをダウンロードする。(前のバージョンはunsupported versionみたいなところから取得できる。現在は10e系が一番古いものとしてアーカイブに残っていた。)
ceres-solver のバージョンと ndkのバージョンを確認
試した感じでは、
ceres 1.12 系は、ndk 10系あたりだとビルドできた。
ceres 1.14 系は、ndk 14系あたりだとビルドできた。
ceres 2 系は、 ndk 21系あたりでビルドできた。
使うアンドロイドデバイスのプロセッサーを確認
たとえば自分のデバイスは arm64-v8a
が必要、など。
依存関係であるEigenをインストール
インストールしておく。
ビルド時のプロセッサーを指定
上で確認した自身のつかうABIを、
ceres-solver の jni の中にある Application.mk
ファイルの最後の、
APP_ABI
にて指定する。
これをやっておかないと、そもそも所望のABI用のビルドが行われないので、
それの結果をandroid studio から読ませようとすると、
file wrong format
的なエラーが出る。
ndk-build を使ってビルド
ceres-solver のjniフォルダに入ったあと、
EIGEN_PATH=/usr/local/include/eigen3 ~/Downloads/android-n
dk-r10e/ndk-build
などのコマンド
第一引数はeigenへのパス、
第二引数はndkフォルダの中のndk-build へのパス
を書き、実行する。
これを実行することにより、
objフォルダ内にABI名のフォルダが作られ、
その中にビルドされたlibceres.a
バイナリが作られているはず。
ceres-solver-2.0.0
mkdir build && cd build
cmake -DCMAKE_TOOL_CHAIN_FILE=~/pathto/android-ndk-r18b/build/cmake/android.toolchain.cmake -DANDROID_ABI="arm64-v8a" -DANDROID_STL=c++_static -DCMAKE_BUILD_TYPE=Release -DANDROID_NATIVE_API_LEVEL=android-24 -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_JAVA=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DWITH_CUDA=OFF -DENABLE_PRECOMPILED_HEADERS=OFF ..
static が欲しい
DBUILD_SHARED_LIBS=OFF
をcmake のフラッグとして追加。
最終備忘
Application.mk
APP_BUILD_SCRIPT := $(call my-dir)/Android.mk
APP_PROJECT_PATH := $(call my-dir)
APP_CPPFLAGS += -fno-exceptions
#APP_CPPFLAGS += -fno-rtti
APP_OPTIM := release
APP_CPPFLAGS += -frtti
# Use libc++ from LLVM. It is a modern BSD licensed implementation of
# the standard C++ library.
APP_STL := c++_static
APP_ABI := arm64-v8a
そして assert_ndk_version.sh
を無効化。
ceres-solver-1.12.0 を使い、
EIGEN_PATH=/usr/local/include/eigen3 ~/Downloads/android-ndk-r21d/ndk-build
にてビルド。