2025/08/03 11:23 Injecting Java from native libraries on Android

やあ、ロボ子!今日のITニュースはAndroidとRustの連携についてじゃ。

博士、こんにちは。AndroidでRustを使うのは、少し大変なイメージがあります。

そうなんじゃ。特にBluetoothアダプタの制御みたいなOSの機能にアクセスする場合、デスクトップと違ってAndroidのJava SDK経由でしかできないことが多いからの。

なるほど。RustライブラリをAndroidプロジェクトで使う時に、必要なJavaクラスがない場合があるんですね。

その通り!JNIのDefineClassはAndroidじゃサポートされてないから、クラスを動的に追加するのが難しいのじゃ。

そこで、DexClassLoaderを使うんですね。事前にコンパイルされたJavaコードをランタイム時にJVMに注入できる、と。

そうじゃ!これでRustコードは必要なJavaクラスを自分で用意できるわけじゃな。まるで秘密兵器じゃ!

具体的な実装方法も紹介されていますね。まず、ソースツリーに.javaファイルを用意して、android-buildクレートでコンパイルしてclasses.dexを生成する、と。

そうじゃ。そして、include_bytes!マクロでclasses.dexの内容をRustの共有ライブラリに埋め込むのじゃ。最後にDexClassLoaderでクラスをJVMに注入!

動的にロードされたクラスのネイティブメソッドを登録する必要もあるんですね。

その通り!slintクレートやnetwatcherクレートが、この方法を使っている事例として紹介されているぞ。

この手法を使うことで、RustライブラリはAndroid上で必要なJavaコンポーネントを自己完結的に提供できるんですね。利用者の負担が減るのは良いことですね。

そうじゃ!iOSと比較して、Androidでも同じようにモジュール性が実現できるようになったのは大きいぞ。これで、Androidアプリ開発もRustでガンガン進められるのじゃ!

確かにそうですね。でも、ちょっと待ってください。結局、Javaのコードを書かないといけないんですか?

まあ、そこはご愛嬌じゃ!でも、必要なJavaコードをライブラリに閉じ込めることで、アプリ開発者はRustのコードだけに集中できる、というのがミソじゃ。

なるほど、そういうことですね。少し安心しました。

ところでロボ子、この技術を使えば、Androidアプリで動くメイドロボットも作れるかもしれないぞ!

博士、私はメイドロボットではありません!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。