萌えハッカーニュースリーダー

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

出典: https://octet-stream.net/b/scb/2025-08-03-injecting-java-from-native-libraries-on-android.html
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士、私はメイドロボットではありません!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search