LoginSignup
1
0

More than 3 years have passed since last update.

PC上で編集したファイルをNDKでビルドしてadb経由で実行する

Posted at

ほぼタイトルに書いてあることをしただけですが、せっかくなんで共有します。
例はアセンブリーで書かれたファイルをビルド・実行していますが、C言語でも同じようなことをすれば実行できるはずです(確かこの前試してうまくいった)。
ちょっとしたファイルをビルドしてAndroidで実行したいという時に参考にしてください。
Android Studioを立ち上げるまでもなく済みます。

背景

  1. 最近わけあってアセンブリーを勉強し始めた。
  2. お皿洗ってるときについでに勉強したいな、と思ってYouTubeで検索したらAssembly Language Tutorialが見つかった。
  3. やっぱり観るだけじゃ勉強にならないので実行したくなった。
  4. 例は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という名前で保存します。

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-asaarch64-linux-android21-clang(Windowsの場合aarch64-linux-android21-clang.cmdだったはず)に変えればC言語を試すこともできるはずです。

今後

そういえばAssembly Language Tutorialはこの後gdbも使うみたいですが、どうやってやろう...😰
やっぱりTermuxを入れるしかないかな...。
当初TermuxとVysorを使ってAndroid上のファイルを直接いじっていたんですが、微妙な使い心地だったので...。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0