android studio gradle cmark 分かんない民のための 「Android C++ ライブラリビルド」
2021年8月からGoogle Play公開は、64bit対応が必須に
arm64-v8a のsoファイルが生成したい
android studio gradle cmark 分かんない民(自分)です。
androidアプリの64bit対応 必須まで1年ちょっとということで利用しているライブラリ周りを64bit化していく
手書き文字認識ライブラリを利用していたので今回は、これを64bitに対応させたい。
unity androidの場合の ライブラリの確認
2015年位にgoogleplayに最初リリースした時のソースを再度使用する。
https://github.com/lizaifang/zinnia
このjniラッパー作成済みのプロジェクトを使いたい
32bitで作成していた時は、android NDK r8でarmeabi-v7a 32bitでビルドしてsoファイルのみUNITYに再配置を行った。
再度同手順にて、arm64-v8a のsoファイルが生成したい。
当時は、eclipse でサンプルのビルドを行うだけでsoファイルの生成ができたが、
公式のIDEもandroid studioになり、 gradle とcmarkの設定を行う必要がある。
普段unityでのみ開発しているのこと、今回必要なのはUnityで使用できるライブラリのみなので
android ndkのコマンドラインでビルドすることにした。
android studioの学習するかは、また今度。
・android ndkの最新版をダウンロードする。
・ndkのpathを通しておく
・cmdで ndk-buildを実行する →エラーでる
・エラー対応していく
・生成されたsoファイルをUnityへ配置する。
android ライブラリのアーキテクチャの確認
まず、現状Unityで使用しているライブラリのアーキテクチャの確認から。
windows環境なので、未だにCYGWIN使ってます。
cygwin 起動後 以下で確認 (cygdrive でファイルパスを指定する場合 ¥を/に変更してください)
armeabi-v7a 32bit アーキテクチャで有ることを確認します。
古いライブラリ ビルド手順
古いNDKだとarm64-v8aを生成できなかったので、android ndkをupdateする。
今回は、android studioでダウンロードしたパッケージを利用した。
ファイルの場所 「21.1.6352462」はバージョン
C:\Users\{ユーザー名}\AppData\Local\Android\Sdk\ndk\21.1.6352462
パスは以下2つを追加する
変数名 ANDROID_NDK_HOME
値: ndkのファイルの場所 (例 C:\Users\{ユーザー名}\AppData\Local\Android\Sdk\ndk\21.1.6352462)
変数名 path (以前のパスがあれば上書き)
値: ndkのファイルの場所 (例 C:\Users\{ユーザー名}\AppData\Local\Android\Sdk\ndk\21.1.6352462)
cmdで ndk-buildを実行する →エラーでる
コマンドプロンプトを起動
①jniのフォルダパスへ移動
例
>cd C:\Users\user\Downloads\zinnia-1-master\zinnia-1-master\android\jni
②ビルドを実行する
C:\Users\user\Downloads\zinnia-1-master\zinnia-1-master\android\jni>ndk-build
③サンプルライブラリが古いndkにて構成されているためエラーが出る
修正手順
① C:\Users\user\Downloads\zinnia-1-master\zinnia-1-master\android\jni内の
application.mkファイルを
APP_STL := stlport_static から
APP_STL := c++_shared に変更する
②C:\Users\user\Downloads\zinnia-1-master\zinnia-1-master\android\project.properties内の
target=android-19を
target=android-1に変更
これで再度ビルドを行うと、 C++のバージョンが11 または17に変更されているため
廃止になっているコードがいくつか出てきてエラーとなる
修正例
①SVM.CPP 50行目付近
1 |
std::random_shuffle(index.begin(), index.begin() + active_size); |
ランダムの廃止のため以下に変更する
1 2 3 |
std::random_device seed_gen; std::mt19937 engine(seed_gen()); std::shuffle(index.begin(), index.begin() + active_size,engine); |
②trainer.cpp 106行目付近
1 |
// x_.push_back(std::make_pair<std::string, FeatureNode *>(y, fn)); |
文字の学習機能は、別途PCで行っているため、 コメントアウトした(;;)
③ return 0;追記 数カ所あり
1 2 3 4 |
C:/Users/user/Downloads/zinnia-1-master/zinnia-1-master/android/jni/libzinnia.cp p:303:1: error: control reaches end of non-void function [-Werror,-Wreturn-type] } |
各cppファイルを開いて
return 0;で戻り値を明示する。
これで再ビルドすると 今度は完了した。
64bitライブラリをunityに適用させる方法
ビルド後のsoファイルの場所は、
C:\Users\user\Downloads\zinnia-1-master\zinnia-1-master\android\libs内の各フォルダ
armeabi-v7a →32bit用のライブラリ
arm64-v8a → 64bit用のライブラリ
x86 →使用しない
x86_64 →使用しない
ただし、 以前はlibzinnia.so 1ファイルだったものが libc++_shared.soとセットになっている。
2つの.soファイルをコピーして
unityの構成内
Assets\Plugins\Android\libs内に
armeabi-v7aフォルダ
arm64-v8aフォルダ それぞれに貼り付け
フォルダがない場合は、手動で作成。
なお、unity側のdll呼び出しは、以前と同様です。(libc++_shared.soを追加する必要なし)
以上で終了♪
android studio gradle cmark 分かんない民でもなんとかなった
android studio gradle cmark 分かんない民でもなんとかライブラリを作成することができた。
同じような事例あると思います。sqlite3とか、 pdf等
iosは、別途対応予定です。
androidほど面倒じゃないので楽ちん。
参考にしたページ
https://developer.android.google.cn/distribute/best-practices/develop/64-bit?hl=ja
http://blog.livedoor.jp/nyangostar/archives/79801661.html
最近のコメント