ほぼタイトルに書いてあることをしただけですが、せっかくなんで共有します。
例はアセンブリーで書かれたファイルをビルド・実行していますが、C言語でも同じようなことをすれば実行できるはずです(確かこの前試してうまくいった)。
ちょっとしたファイルをビルドしてAndroidで実行したいという時に参考にしてください。
Android Studioを立ち上げるまでもなく済みます。
背景
- 最近わけあってアセンブリーを勉強し始めた。
- お皿洗ってるときについでに勉強したいな、と思ってYouTubeで検索したらAssembly Language Tutorialが見つかった。
- やっぱり観るだけじゃ勉強にならないので実行したくなった。
- 例はARM 32bit向けなので、手元のAndroidスマホなら実行できるかな、と思った。
- 実際にはARM 64bitなので結構勝手が違い、移植に苦戦しましたが...
あらかじめインストールしたもの
- Android NDK r20(以下、「NDK」と呼びます)
- Android SDK Platform Tools 29.0.2(以下、「Platform Tools」と呼びます)
やったこと
必要なコマンドをPATH
に追加
私の場合、
-
C:\android-sdk\android-ndk-r20b
にNDKを、 -
C:\android-sdk\platform-tools
にPlatform Toolsを
インストールしたので、以下のディレクトリーをPATH
に追加しました。
C:\android-sdk\android-ndk-r20b\toolchains\llvm\prebuilt\windows-x86_64\bin
C:\android-sdk\platform-tools
あとは繋いでadb push
して実行するだけ
準備ができたら、お手持ちのAndroid端末を繋ぎましょう。
環境によってはさらに追加のドライバーや設定が必要かも知れませんが、手元の端末はすでにそこはクリアしているので省略します。
続いて、ビルドしたいソースコードを用意します。
冒頭に挙げたAssembly Language Tutorialを参考に、status code 65でexitするだけという、Hello Worldですらないものを書きました。
asmtut1-1.s
という名前で保存します。
.text
.global _start
_start:
MOV X0, #65
MOV X8, #93
SVC 0
※Assembly Language TutorialではARM 32bitのアセンブリーを紹介していますが、私の手元の端末はARM 64bitなので、仮想 Arm64 マシンの作り方を参考に翻訳しました。
きっとこれ以降も翻訳が必要な箇所があるかと思いますが、頑張ります。
ファイルができたら次のコマンドを入力してビルドします。
> aarch64-linux-android-as.exe asmtut1-1.s -o asmtut1-1.o
> aarch64-linux-android-ld -o asmtut1-1 asmtut1-1.o
as
コマンドとld
コマンドにaarch64-linux-android-
を付けただけです。
あとはadb push
で端末に転送して実行するだけです。
とりあえず実行するだけなら/data/local/tmp
というディレクトリーを使うのが簡単です。
> adb push asmtut1-1 /data/local/tmp/
asmtut1-1: 1 file pushed. 0.1 MB/s (856 bytes in 0.014s)
# Android端末上のshを起動する
> adb shell
# 実行権限を付けるのを忘れずに!
ocean_n:/ $ chmod +x /data/local/tmp/asmtut1-1
ocean_n:/ $ /data/local/tmp/asmtut1-1
65|ocean_n:/ $ echo $?
65
#^ exit codeがX0にMOVした値、65になった!
aarch64-linux-android-as
をaarch64-linux-android21-clang
(Windowsの場合aarch64-linux-android21-clang.cmd
だったはず)に変えればC言語を試すこともできるはずです。
今後
そういえばAssembly Language Tutorialはこの後gdbも使うみたいですが、どうやってやろう...😰
やっぱりTermuxを入れるしかないかな...。
当初TermuxとVysorを使ってAndroid上のファイルを直接いじっていたんですが、微妙な使い心地だったので...。