FC2ブログ

スマフォのアプリを作りたい(27):スマフォだけで動作する音声認識③

   プログラミング [2020/07/09]
JuliusをAndroidスマフォ上で動作させたいと思ってます。
概ね
Ⅰ.まずはJavaコードからC関数を呼び出すようなアプリの作り方を調べます。
Ⅱ.Javaコード(Cライブラリ含む)をReact Nativeで使えるパッケージ化方法を調べます。
Ⅲ.React Nativeにパッケージを取り込んで、Build&Go。
の順番かと思ってますが、現状は未だの途中です。

前回、AndroidStudioでC++のプロジェクトを作成して、テンプレートを動作させました。
それと、Juliusのライブラリ使用のサンプルjulius-simple.cをちょっと俯瞰してみました。

その続きです。


◆続:AndroidStudio環境へのJuliusLib移植
前回julius-simple.cを見ていて気になる点が2つほどありました。
※1:標準出力を使っている。→Androidでは?
※2:音声データの入力方法に「バッファ渡し」的なものはない。

※1の件に関しては調べだしたらすぐ解決しました。
Androidでは標準出力はlogcatになっている(標準エラー出力も含む)そう。
訂正:誤報です。標準出力がだまっててもlogcatに出力されるわけではありませんでした。
詳細は次回に記載いたします。m(__)m


「では、MIC入力は?」とも思いますが、
動き出せたら、Juliusがエラー等のメッセージを出力してるでしょうから、きっと対策の糸口は見えるかと。


AndroidStudioのC++テンプレートでのJavaからC関数のコールのところがまだモヤモヤです。
もうちょっと深追いが必要です。
参考:https://qiita.com/ymmtyuhei/items/7109579210af34ec697c

JNI(Java Native Interface):Javaとネイティブコードとのインタフェース仕様のことだそうです。
呼び出し元のJavaでstringFromJNI()とされている関数名が、呼び出し先で酷く長い関数名になっていたのは、この仕様によるもののようです。
native-lib.cppで定義されていた関数名の形式・意味は、以下だそうです。

Java_[呼び出し元のパス(src後のパス&“_”区切り)とファイル名(拡張子なし)]_呼び出し関数名()

なので、stringFromJNI()
Java_com_teburarec_call_1julius_MainActivity_stringFromJNI()になるわけです。
途中のcall_juliusと言うフォルダがcall_1juliusと表現されているのは、区切り記号としての「_」とフォルダ名中の「_」を区別するためなんだろうなと思います。


では、移植作業を始めましょう。
上記の参考サイトが参考にしている本家サイトの説明を読んでみます。
参考:https://developer.android.com/studio/projects/add-native-code?hl=ja

まずはソースを作成/追加しろと書かれています。


1)JuliusLibのソースの持ち込み
Juliusサイトからダウンロードしてきたディクテーションキットに含まれるソースからコピーします。
dictation-kit-4.5\src\julius-4.5フォルダ下のlibjulius、libsentをフォルダごとAndroidStudioのプロジェクトフォルダにコピーします。
コピー先:(プロジェクトフォルダ)\app\src\main\cpp ・・・・native-lib.cppのあるフォルダ


2)native-lib.cppへのjulius-simple.c内処理のマージ
2-1)julius-simple.c内の「#include ・・・」から内部関数をnative-lib.cppの「#include ・・・」の下にコピペしました。
2-2)julius-simple.c内のmain()の処理コードをcom_teburarec_call_1julius_MainActivity_stringFromJNI()の処理コードにまるっと置き換えました。

この時点で、AndroidStudio側で、native-lib.cppを開くと、自動的に静的解析(って云うんでしょうか)が行われているようで、辻褄の合わない箇所がエラーとして表示されます。(変な箇所が赤字で表示されて、ポインタを載せるとエラーの内容が表示されます。)

まずは、先頭の「#include 」で、「そんなパスは存在しない。」と出ます。
なので、それ以降のライブラリのヘッダに含まれる定義(変数、定数、関数)が全部未定義のものというエラーです。

早い話、JuliusLib用のインクルードパスをどっかで指定しないといけないですね。

先の本家ページの次の手順がCMakeを設定しろなので、設定の仕方を調べました。
CMakeの設定は、CMakeList.txtで行うんですね。
native-lib.ccppと同じフォルダ:(プロジェクトフォルダ)\app\src\main\cppにありました。

3)CMakeList.txtの編集
3-1)CMakeList.txtでインクルードパスを指定します。
以下の朱書きの記述を追加しました。
----CMakeList.txt---------------------------------

add_library( # Sets the name of the library.
native-lib


native-lib.cpp )

# インクルードパス指定
target_include_directories( # ターゲット名
native-lib
# Private指定
PRIVATE
# インクルードパス
${CMAKE_CURRENT_SOURCE_DIR}/libjulius/include
${CMAKE_CURRENT_SOURCE_DIR}/libsent/include
)



---------------------------------------------------


さらに、-Dコンパイルオプションで振り分けされているインクルードファイルがあるらしく、その中で定義されている定数も未定義となっていました。

3-2)CMakeList.txtでコンパイルオプション(-D)を指定する。
以下の記述を追加しました。
----CMakeList.txt---------------------------------
# コンパイル オプション指定
option(__ANDROID__ "for Android" ON)
if(__ANDROID__)
add_definitions(-D__ANDROID__)
endif()

---------------------------------------------------



4)native-lib.cppの修正
この時点で残ったエラーは、元のjulius-simple.cのmain()からそのままコピペした部分でした。

・引数(argc,argv)の参照がそのままになっている点
 →引数の問題は、参照部分削除/固定値の参照に変更
  const int argc = 3;
  const char *argv[] = {"julius-simple", "-C", "simple_keyword.jconf"};

・char * を指定するべき引数に、const char *を指定していると警告
 「jconf = j_config_load_args_new(argc, argv);」を
 →「jconf = j_config_load_args_new(argc, (char **) argv);」に変更
 「while (get_line_from_stdin(・・・, "enter MFCC filename->") != NULL) {」を
 →「while (get_line_from_stdin(・・・, (char *) "enter MFCC filename->") != NULL) {」

・リターンが数値になっている点・・・元のテンプレートは文字列(ポインタ)
 →「return env->NewStringUTF("メッセージ");」に変更

としました。

-ちょっとハマった:静的解析機能の混沌-
これで、ひとまずjulius-simple.cベースのnative-lib.cppのフラグはとれた。・・・かと思いきや。

何回かCMakeList.txtや、ソースコードをAndroidStudioで書き換えてたのですが、最初のころは書き換えた時点でAndroidStudioが新しい内容で再チェックするような動きをしてました。ですが、その内チェックし直さないようになりました。エラーが消えません。その場合は、エラー個所にカーソルを置いて、[Alt]+[Enter]を押すと赤字表示が赤以外に変化して「問題ない」状態を表してました。

さらに、最初にエラーが消えたと思った、「#include 」が、何かの拍子に再度エラーに復活した。おかげでコードの中で使っているヘッダで定義されているものが全部赤表示に戻りました。

ただしこの段階でビルドした場合は、同様のエラー(インクルード・ヘッダが Not Found)にはならなかった。
つまり、Inspection機能(以降、静的解析と呼んじゃいます。)だけの問題のようです。

最初から出てたのかもしれませんが、AndroidStudioの上部に「Unable to execute Clang-Tidy: Cannot create property=Diagnostics for JavaBean=com.jetbrains.cidr.lang.daemon.clang.tidy.ClangTidyYamlLoader...」というエラーが表示されっぱなしです。ClangTidyはコードチェックツールらしいので、修正結果を自動で更新チェックしなくなった件と関係するんでしょうか。
上記したメッセージは放置しても構わないのか?とも思ったのですが、メッセージの後ろに「設定」が行えるリンクが貼られていたので、クリックしてClang-Tidyの有効?チェックを外したらメッセージは消えた。でも正しい処置とは思えない。注1)

それでも、静的解析の#includeに絡む警告は消えません。

「Unable to execute・・・」の件を調べましたが、AndroidStudio3.5とNDK r21では互換性がない?とかの書き込みがあって、AndroidStudio4.0では対策されているとありました。調べたら、その条件に当てはまりました。注2)
ちょっと身も蓋もない話で俄に信じがたい感じですが、Clang-Tidyのチェックを外したのは正解かも。

Clang-Tidyと切り離して、さらにググりましたが、なかなか解が見つかりません。
そんなこんなしている間に、AndroidStudioを一旦終了(PCの再起動を含む)し、再起動したら・・・
あれ?エラー表示が消えました。何で?


以下の参考サイトを見つけて、能動的に静的解析を実行することを考えていたのですが、肩透かしに会いました。注3)
参考:https://gihyo.jp/dev/serial/01/android_studio/0040


注1)Clang-Tidyを有効に戻す手順は
 -[File]-[Settings...]選択
 -左側リスト欄の「Editor」を展開し、Inspectionsを選択
 -右(中)側のリストから「C/C++」を展開
 -「Gerenal」-「Clang-Tidy」をチェックし、右下の[OK]をクリック

注2)AndroidStudioのバージョン確認は、メニュー[Help]-[About]
 NDKのリビジョンの確認手順は
 -メニュー[Tools]-[SDK Manager]選択
 -右側欄の「SDK Tools」タブを選択
 -右下の「Show Package Details」をチェック
 -「NDK(Side by side)」の下でチェックされているのがそれ

注3)Inspectionの実行は、
 -[Analyze]-[Isnpect Code...]選択
 -チェックする範囲(プロジェクト全体、単独ファイル等)を選択し実行
 -[Inspection Result]タブが画面下に作成される



CMakeList.txtで指定したインクルードパスが有効にならなかった件は放置して、本家サイトに書いてある3番目のGladleを設定しろをやってみます。

・・・


5)Gladleの設定
参考:https://developer.android.com/studio/projects/gradle-external-native-builds?hl=ja

上記本家サイトの「Android Studio UI を使用する」の説明によると「Link C++ Project with Gradle」を実行するように書かれているのですが、そのメニューが出てきません。おそらく、プロジェクト自体がC++ライブラリを使用する前提で作成されているので、「済」なのではないかと思います。
AndroidStudio上の左側で「Android」ペイン(というらしい)を選択し、[Gradle Scripts]-[Buold Gradle(Module.app)]をクリックして中身を確認すると、以下のそれらしい記述が既に入ってました。
----(プロジェクト)\app\build.gradle--------------

android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.teburarec.call_julius"


externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}

}
:
:
---------------------------------------------------


これで、フロントのjulius-simple.cの移植&設定は完了かと思いますが、肝心のJuliusLibのビルドの設定がです。
当然ですがこの状態でビルドした場合リンクで失敗します。


6)libjulius/libsent用CMakeList.txtの作成
こっからが本番ですよね。
Gradleビルドの設定に2つのJuliusライブラリを追加でビルドできるようにすれば、いけるんではないかと。

6-1)libjulius/libsent用のCMakeList.txtの作成
もともとあった、native-lib.so用のCMakeList.txtを参考にして、libjuliusフォルダとlibsentフォルダ直下にCMakeList.txtを新たに作成します。

libjulius側(プロジェクトフォルダ\app\src\main\cpp\libjulius\CMakelist.txt)はこんな感じ。
注)以下の内容には間違いがあります。
----libjulius用CMakelist.txt-----------------------


#----------------------------------
# libjulius
#----------------------------------
# ライブラリ指定
add_library( # Sets the name of the library.
libjulius
# Sets the library as a shared library.
SHARED

# Provides a relative path to your source file(s).
src/recogmain.c
src/instance.c


src/version.c
)

# ライブラリ名の指定
set_target_properties(libjulius PROPERTIES OUTPUT_NAME "julius")

# インクルードパス指定
# include_directories(libjulius/include, libsent/include)
target_include_directories( # ターゲット名
libjulius
# Private指定
PRIVATE
# インクルードパス
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/../libsent/include
)

# コンパイル オプション指定
option(__ANDROID__ "for Android" ON)
if(__ANDROID__)
add_definitions(-D__ANDROID__)
endif()

---------------------------------------------------

※makefileの記述形式もほとんど理解できてないさるですが、もともとあったlibjulius\Makefile.inから必要ソースのリストは引っ張ってきました。
細かいコンパイルオプション等は後回しで、まずはビルドのパスを通すことを優先してます。

libsent側も似たような感じで作成しました。

これをGradle設定からの依存関係の追加でやるのかと思って、app\build.gradleexternalNativeBuildを追加してみたのですが、どうもうまくいきません。
native-lib.cppを編集した直後と同じく、インクルードパスが有効になってません。

さらに調べると、どうも元のCMakeList.txtに記述を追加してやるもの?やれるらしい。
参考:https://www.hiroom2.com/2016/09/07/makefile%E3%82%92cmakelists-txt%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B/
参考:https://developer.android.com/studio/projects/configure-cmake?hl=ja#include-other-cmake-projects

参考サイトの説明を見ながら、以下の記述をnative-lib用のCMakeList.txtに追加しました。
注)以下の内容は正しくないのでマネしないでね。
----native-lib用のCMakeList.txt-------------------


set( libsent_DIR libsent )
set( libsent_build_DIR libsent/outputs )
file( MAKE_DIRECTORY ${libsent_build_DIR} )
add_subdirectory( ${libsent_DIR} ${libsent_build_DIR} )

set(libjulius_DIR libjulius)
set( libjulius_build_DIR libjulius/outputs )
file( MAKE_DIRECTORY ${libjulius_build_DIR} )
add_subdirectory( ${libjulius_DIR} ${libjulius_build_DIR} )



target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib}
# 追加ライブラリ
${libsent_build_DIR}/libsent.a
${libjulius_build_DIR}/libjulius.a

)
---------------------------------------------------



-ちょっと脱線:AndroidStudioアップデート-
そうこうしている内に、AndroidStudioから「ツールのアップデート版があるから、インストールしない?」とメッセージが表示された。
何がアップデートされたのかはメッセージにはなくて、開始したら説明画面が出てくるとおもって、気軽にアップデートを指示したところ、予想に反して本体のAndroidStudio自体のアップデートを始めた。(それならそうと・・・)
ともかく、途中で強制終了させたりしたら、もっと厄介なことになるかと思って、そのまま続けた。
AndroidStudioが再起動されてから確認したら、バージョンが4.0になってました。

そのまま使っていると、今度はGradleをアップグレードしろと・・・
それもなすがままに任せると、次はNDKでした。

結果:
AndroidStudio:3.5→4.0
Gradle:6.0?→6.1.1
NDK:21.0→21.3



それでもビルドはうまくいきません。

【現象】
libsend側のソースコンパイルの途中で、native-lib(親)のリンクが走って、libjuliusの関数を参照しているところでエラーになります。
そりゃそうだ、libjulius側のビルドもまだ走ってない段階でリンクしようとしてるんだもん。
なぜ、参照ライブラリのビルドの完了を待たない?

libjuliusのCMakeList.txtは実行されているのか確認しようと思って、CMakeのmessageコマンドを追加で入れてみた。
・・・
でもこのメッセージはAndroidStudio環境下ではどこに出力されるんでしょうか?
IDEの画面のSync/Buildのコンソール・スペースには表示されていないような。
(ビルドがある程度走るようになると、ビルドのメッセージを表示するスペースに出てきますが、この時点では出ませんでした。)
(プロジェクトフォルダ)\app\.cxx\cmake\debug\armeabi-v7a\build_output.txtに記録されていました。

3つのCMakeList.txtは、思った順番で実行されているようです。
でも、リンクの終了は待ってない。・・・

libsent/libjuliusのCMakeList.txt内の(誤)add_library()で「SHARED」を指定しまってました。それを(正)「STATIC」に修正してみました。

ですが状態は悪化。libsentのコンパイルすら走りません。

【原因】
CMakeが作成するMakeファイルを探して、どうなってるのか見ました。
AndroidStudioというか今回の環境ではNinjaというビルドシステムを使うようで、メイクファイルらしきものはbuild.ninjaという名前のファイルでした。

その手の中間生成物(CMakeとNinjaが作成するファイル)は、\app\.cxx\cmake\(debug|release)\(仕向け先デバイス)\の下に作成されます。
実際には、\app\.cxx\cmake\debug\armeabi-v7a

build.ninjaの中を覗いてみると、参照ライブラリを作成しようとしているフォルダと、リンクで参照しようとしているフォルダが違うような・・・

さんざん、あっちこっちの解説を読み漁った挙句、以下のサイトの解説を読んだら、
参考:https://cmake.org/cmake/help/latest/command/add_subdirectory.html

add_subdirectory()で相対パス指定する場合、ソースパス(第1パラメタ)とバイナリパス(第2パラメタ)の基準パスは別だと書いてある。
AndrodStudioの環境下でのデフォルトのバイナリパスは、先の\app\.cxx\cmake\debug\armeabi-v7a\のようです。
さるは、「相対パス指定の場合、ソースパスとバイナリパスの基準はCMakeList.txtがあるフォルダだと思い込んでCMakeList.txtを書いている」ため、指定した出力オブジェクト(.a)の正しい依存関係が成立していなかったようです。

何も知らんくせに適当に参考サイトのサンプル記述をマネしたおかげで、add_subdirectory()とtarget_link_library()の不整合になっていたということです。

ここで丸三日程足踏みした。
でも、まだまだビルドの正常処理にはなりません。


6-2)libsent:gzgets等が参照エラー
zlibをサポートしているかどうかで、そのライブラリを指定する必要があるみたいです。
非サポートとしてのコンパイルオプションも存在するようですが、NDK内のlibフォルダ(AndroidSDKフォルダ\ndk\21.3.6528147\platforms\android-23\arch-arm\usr\lib)を覗くとlibz.soがありました。同じく、liblog.soもあります。
なので、既にリンクが仕込まれているlogライブラリをマネて、find_library()を行ってから、その名前でtarget_link_libraries()に記述を追加してみました。
でも、うまくいきませんでした。
AndroidStudioのビルド時のメッセージを見ると、libz.aの検索結果がNDKのlibフォルダではない。

find_library()を止めて、「z」とだけ指定してみたら・・・うまく行ったようです。


6-3)libjulius:libsent内の関数参照でエラー
libjuliusのCMakeList.txt内にtarget_link_libraries()を追加して、libsentをリンクするようにして見たら、参照エラーが解消した。
ただし、AndroidStudioでのビルド時のメッセージを見ると、「-llibsent/libsent.a」の記述が「-llibjulius/libjulius.a」の記述を挟んで2回出てきてるだけの変化だった。
なのでもしかしてと思って、native-lib用のCMakeList.txtのtarget_link_libraries()でのlibsentとlibjuliusの順番を変えてみた。
解消した。
libjulius用CMakeListtxtのtarget_link_libraries()の追加は取りやめ。


6-4)libjulius:adin_mic_xxx関数参照でエラー
adin_mic_xxx関数は、本来libsent内で定義されているもののようです。

libsentのMakefile.inの内容でコンパイルソースのリストを調べたときに、最後に「@EXTRAOBJ@」と記述されています。
これが、変数を表していてその変数をセットするのがconfigureというコマンド?手順?のようです。
JuliusBookにそんな感じのことが書かれていました。でも、さるconfigureが何であるかも知りません。

JuliusBookによると、コンパイルオプションに「--with-mictype」というのがあって、マイク入力で使用するAPIを選択するらしい。
Linuxの場合は、alsa、oss、esdのいずれか、あるいはauto(指定なしと同じ)を指定するとなっている。

これらオプションが何を表すのか・・・ググりました。
PlusAudioというのが「クロスプラットフォームでネットワークに対応したサウンドサーバー」で、それより以前のサウンドサーバー仕様?規格?がESD(Enlightened Sound Daemon)だそうです。一方、OSS(Open Sound System)は、サーバーというよりは、サウンド関連の標準インタフェースで、ハードウェアに直接アクセスする方式らしい。さらにALSA(Advanced Linux Sound Architecture)は、「OSSを置き換えるために開発されたLinuxカーネルコンポーネント」だそうだ。それぞれ表現が微妙に違っているから、全く同じレベルのものではなさそう。ともかく「音を扱う際のAPI」をそれぞれ持ってるってことでしょう。


解らないながらも、libsentフォルダ内のconfigure.inを見てみました。
Linux環境だと、以下のような感じかな。

--with-mictypeソース-lライブラリ
alsasrc/adin/adin_mic_linux_alsa.c-lasound
pulsaudio※src/adin/adin_pulseaudio.c-lpulse-simple -lpulse
osssrc/adin/adin_mic_linux_oss.c
esdsrc/adin/adin_esd.c-lesd

※configure.ini内では、Linuxでもpulseaudioの指定もアリに見えた。
※autoを指定したときに、どうやってオプション項目(alsa|oss|esd)を決めるのかは未だ理解できないままです。

リンクする各ライブラリ(頭にlibを付けた.a/.os)がNDKに含まれるのか見てみましたが、いずれも見当たりません

疑1)adin_mic_linux.cという名前のソースがありました。でも関数の参照元がadin_mic_linux_XXXX.cではなかった。これは何用?
疑2)ossだと追加ライブラリが必要ない? これのI/FはAndroid本体内に組み込まれているとか?

ossがライブラリ不要に見えたので、試しにadin_mic_linux_oss.cをCMakelist.txtに追加してみました。
でもやっぱり参照エラーが出ます。

configure.inの作りとJuliusBookの説明は、あくまでもLinuxに関するものですものね。

Juliusでは「Androidでも動作させられる」と言ってる割にはAndroid版ビルドに関する説明/コメントは見当たらない。
非常に残念です。

Andoridについては、サウンドドライバが標準では準備されていないみたいな記述がありました。
参考:https://atsushieno.github.io/exqiita/2015/12/15/
でもって、Android本家のページでは、
参考:https://developer.android.com/ndk/guides/audio?hl=ja
OpenSL ES仕様?を使え?ライブラリとしてはAAudio?かOboe?を使え。どっちが推奨なのかいまいちよくわからない「注」まで付いてます。

もう、ちょっとお手上げですね。

結局のところ、先々マイク入力機能をこのライブラリに求めるわけではなく、実験としてあったら便利と思っているだけなので、
現状のビルドを先に進めることにしました。ともかくビルドさえ通れば。

adin_mic_linux.cをCMakeList.txtのadd_library()内のソースリストに追加してみました。
理由は理解できてませんが、ビルド時の参照エラーは出なくなりました。(後で問題になるかと思うけど。)


6-5)libjulius:fvad_xxx関数参照でエラー
configure.iniによれば、もし「fvadを使用する」場合は、「@EXTRAOBJ@」に「libfvad/libfvad/src/fvad.o ・・・」が追加されているようです。
ライブラリ指定の記述は発見できませんでしたが、明らかに追加のライブラリを参照するようです。

そもそもfvadって何のこと?
Julius本家のページに説明がありました。
参考:https://julius.osdn.jp/index.php?q=newjulius.html
4.5で追加になった新しい機能で、「音声区間検出機能libfvadを取り込んでいる」とある。
ライブラリは別途ダウンロードするものらしい。

Android版のバイナリとかが入手できるのであればいいのですが・・・NDKには含まれてなさそうです。
Julius本家のリンク先で得られるのは他OS/他メイク環境用のようでした。
・・・「別途ビルドが必要」となるとまた時間がかかっちゃう。

新機能は当分使わない設定で進めます。

ソース的には「HAVE_LIBFVAD」をデファインしていると有効になるみたいです。

コンパイルオプションで「-DHAVE_LIBFVAD」とは指定していない。
・・・
julius.hから条件付きで#includeしているconfig-android-libjulius.hで#defineしていました。
これをコメントアウトさせていただきます。

ビルドが通りました。 ヘ(´-`;)ヘ
※一か所、warning(fprintfのフォーマット指定子(%lu)とパラメタの型(sizeof())不一致)が出ましたがそれも直してます。

結局この時点の各CMakeList.txtの内容は以下です。
----native-lib用のCMakeList.txt-------------------


cmake_minimum_required(VERSION 3.4.1)


add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
native-lib.cpp )

# インクルードパス指定
target_include_directories( # ターゲット名
native-lib
# Private指定
PRIVATE
# インクルードパス
${CMAKE_CURRENT_SOURCE_DIR}/libjulius/include
${CMAKE_CURRENT_SOURCE_DIR}/libsent/include
)

# コンパイル オプション指定
option(__ANDROID__ "for Android" ON)
if(__ANDROID__)
add_definitions(-D__ANDROID__)
endif()

# 依存ライブラリ指定
set( libsent_DIR libsent )
add_subdirectory( ${libsent_DIR} )

set( libjulius_DIR libjulius )
add_subdirectory( ${libjulius_DIR} )



find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )

# CMakeList検査用
message( "***** Native Lib *****" )



target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib}
# 追加ライブラリ
z #zlib find_libraryを経由したらNGだった
libjulius #libsent-libjuliusの順にしたらNGだった
libsent

)
---------------------------------------------------


----libjulius用CMakelist.txt-----------------------

# CMakeのバージョン制限
cmake_minimum_required(VERSION 3.4.1)

#----------------------------------
# libjulius
#----------------------------------
# ライブラリ指定
add_library(
# ターゲット名
libjulius
# ライブラリ種別
STATIC
# 構成ソース
src/recogmain.c
src/instance.c


src/version.c
)

# ライブラリ名の指定(指定しないと“liblibjulius.a"になってしまうらしい。)
set_target_properties(libjulius PROPERTIES OUTPUT_NAME "julius")

# インクルードパス指定
target_include_directories(
# ターゲット名
libjulius
# Private指定
PRIVATE
# インクルードパス
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/../libsent/include
)

# コンパイル オプション指定
option(__ANDROID__ "for Android" ON)
if(__ANDROID__)
add_definitions(-D__ANDROID__)
endif()

# CMakeList検査用
message( "***** Lib Julius *****" )

---------------------------------------------------

※libsent用は、指定項目としてはlibjulius用と同じなので省略します。


6-5)コンパイルオプションの確認
ちょっと順番がよろしくない気がしますが、
JuliusBookに載っていた各ライブラリ(libsent/libjulius)のコンパイルオプションの要不要を確認してみました。
・・・
確証はないですが、ほぼ未指定(デフォルト)で(--with-mictypeの件を除いて)問題なさそうな感じです。
ただ、通常(?)configureを経由してコンパイルオプションを決めているので、中間でどんなオプション指定が追加されているのか、はたまた無いのかは全く自信がありません。


7)ビルドと実行
まあ、まともに動きゃしないのは分かってますが、やってみます。

以降、図の表示が小さくて見えない場合は、クリックすると文字が見える程度の画像で表示すると思います。


まずは、ビルドに関しては、
関係するbuild.gladleやCMakeList.txtを変更した場合は、Syncという操作が必要です。
AndroidStudioが勝手に始めちゃうこともあるけど、意図して実施するようにしましょう。
やり方は、AndroidStudioの画面右上の方にある象さんみたいなアイコンをクリックします。
20200708_1.jpg

画面下の[Build]タブを選択して、さらに[Sync]タブを選ぶとSyncの状況/結果が見られます。
20200708_2.jpg

Syncが正常に終わればBuildすることができます。
画面右上のトンカチ・アイコンをクリックするか、
[Build]タブ-[Build Output]タブ左側のトンカチ・アイコンをクリックします。
20200708_3.jpg

もしかしたら、[Build]メニューの[Make Project]で全部やってくれるのかな?

実行に関しては、前回も・・・説明してたかもしれませんが、
[Run]メニューの[Run 'app']か[Debug 'app']です。


JuliusLibをリンクしたnative-lib.soを実行してみた結果、以下の画面になりました。
20200708_4.jpg
結果メッセージ(エラー)が表示されました。 まあ、そりゃそうだよね。


でも、やっとこさ、デバッグの畔(ほとり)にたどり着いた。
難儀したよー。(T^T)


まだまだこの先長そうなので、ここでまた区切ります。
「無駄な説明なげーよ。」のお叱りごもっともですが、ご容赦の程。

では、また次回。御機嫌よう。
m(__)m
スポンサーサイト





コメントの投稿

非公開コメント

カレンダー
01 | 2024/02 | 03
- - - - 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 29 - -
プロフィール

さるもすなる

Author:さるもすなる
さるです。別HPサイト「さるもすなる」から侵食してきました。 山菜/きのこ、それとタイトルにしたPPバンド籠のことをメインに徒然に・・・・暇を持て余したさるの手仕事:男手芸のブログってことで。

最新記事
最新コメント
月別アーカイブ
カテゴリ
天気予報

-天気予報コム- -FC2-
本家のHPのトップ
山菜や茸の話です
PPバンドの籠作品と作り方です
投稿をお待ちしております



PVアクセスランキング にほんブログ村 にほんブログ村 ハンドメイドブログへ



マニュアルのお申し込み



検索フォーム
リンク
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR