English | 日本語
これは native な Android パス: libvokra.so をビルドし、JNI 経由でロード
し、C ABI を直接呼ぶ。Unity 経由で統合する場合は Unity チュートリアル
を使う(本ページはそれを繰り返さない)。Android の GPU 高速化は Vulkan
である(FR-BE-07: NNAPI は恒久非対応)。
リポジトリは scripts/build-android.sh
(M2-11 由来)を同梱する。Android NDK で JNI ライブラリをクロスコンパイルする。
ANDROID_NDK_HOME が必須で、API level 24(Android 7.0)を対象とし、
target/aarch64-linux-android/release/libvokra.so を生成する:
ANDROID_NDK_HOME=/path/to/ndk scripts/build-android.sh正直な scope 注記。build-android.sh は --no-default-features の
CPU-only ビルド(ヘッダに「NO Metal, NO CUDA」)である。Vulkan パスは
ビルドしない — それは §2 の話だ。CPU-only ライブラリはどこでも動く baseline
SKU。GPU 高速化が欲しいときだけ Vulkan を足す。
素の cargo build --target aarch64-linux-android で「そのまま動く」ものは無い:
NDK linker が無いと link 段階で失敗する。NDK toolchain を明示設定し
(godot-crossbuild CI workflow と同じパターン。ビルド機に応じて <host-tag>
を選ぶ。例 darwin-x86_64 / linux-x86_64)、vulkan feature 付きで
vokra-capi をビルドする:
export NDK="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/<host-tag>/bin"
export CC_aarch64_linux_android="$NDK/aarch64-linux-android24-clang"
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$CC_aarch64_linux_android"
cargo build -p vokra-capi --no-default-features --features vulkan \
--target aarch64-linux-android --release
Vulkan FFI は実行時に dlopen ロードされる(何も link・bundle しないので
zero-dependency 不変条件 NFR-DS-02 は保たれる)。libvulkan.so は device 上
でロードされる。
モデルは決して bundle しない。libvokra.so を jniLibs/arm64-v8a/ 下に
同梱し、GGUF をアプリの private storage に push し、その実ファイルパスを C ABI
に渡す。ライブラリをロードし extern を宣言する:
class VokraBridge {
companion object { init { System.loadLibrary("vokra") } }
external fun transcribe(modelPath: String, wavPath: String): String
}
JNI の .c/.cpp shim は vokra.h を include し、getting-started
の C 例が示すのと同じ session API を呼ぶ(vokra_session_create_from_file →
vokra_asr_transcribe → vokra_string_free → vokra_session_destroy)。
モデルは vokra-cli convert でオフライン GGUF 化し、アプリの filesDir 下の
パスにコピーする(C ABI が mmap できる実ファイルパス — NFR-RL-04)。
バックエンドは C ABI の session-builder surface で明示選択する。Vulkan の
loader/device 不在は明示的な BackendUnavailable、Vulkan バックエンドが cover
しない op は明示的な UnsupportedOp — Vokra は CPU へ無言で落ちない
(FR-EX-08)。NNAPI は選択肢ではなく、今後も追加しない(FR-BE-07;
Google は Android 15 で deprecated)。CPU バックエンドは完全サポートの明示
選択肢として残る。
Android の目標は Whisper base で RTF < 0.7(NFR-PF-06)。この数値は実機
計測である: 本チュートリアルはビルドと呼び出しパスを documentation するが、
実機での RTF 計測(および Android Vulkan soak)は owner タスクだ —
docs/m3-18-android-rtf-handover.md 参照。ビルドの成功を RTF の成功と読み
替えないこと。両者は別物である。
| 症状 | 原因 / 対処 |
|---|---|
error: ANDROID_NDK_HOME must be set |
build-android.sh は NDK root を要する。NDK r25+ を入れ ANDROID_NDK_HOME を export する。 |
Vulkan ビルドで error: linking with 'cc' failed |
NDK linker 未設定。§2 の CC_* / CARGO_TARGET_*_LINKER env が必須。 |
実行時に UnsatisfiedLinkError: libvokra.so |
.so が jniLibs/arm64-v8a/ に無いか、別 ABI をビルドした。 |
device 上で BackendUnavailable: vulkan |
使える Vulkan loader/device が無い。CPU ビルドへ明示的にfall back する(--backend cpu)。無言では落ちない。 |
- バックエンドの追加 — Vulkan バックエンドの配線
- デスクトップ CLI — 同梱する GGUF を作る
convert手順 - Web(WASM / WebGPU) — この native パスのブラウザ版の兄弟
最終確認日: 2026-10-04 — scripts/build-android.sh(CPU-only, API 24)と
godot-crossbuild の NDK-linker 先例に対して確認。
- 更新責任: Android ビルドスクリプト・NDK floor・Vulkan feature 配線を 変えた PR が、同一 PR で本ページと英語版を更新する。
- review cadence: 四半期 Go/No-go review(
NFR-MT-05)。オンデバイス RTF は owner が再計測するもので、ここで捏造しない。 - ビルド事実の再取得:
sed -n '1,40p' scripts/build-android.sh