android ndk でC/C++ ソースからアセンブラソースを出力させる

jni/Android.mk に

LOCAL_CFLAGS += -fverbose-asm
LOCAL_FILTER_ASM := python -c 'import sys; import shutil; src = open(sys.argv[1], "rb"); dst = open(sys.argv[2], "wb"); shutil.copyfileobj(src,dst);'

を追加することで C/C++ から出力されるアセンブラソース(リスティングファイル)が残るようになります。

python 環境が必要ですが Android NDK r9 以降は NDK に含まれています。
LOCAL_FILTER_ASM は ANdroid NDK r5 以降なら使用できると思います。

一つのソースコードをコンパイルするたびに python を起動するため処理が重たいです。
Windows 環境であれば copy コマンドを使用するように試してみたのですが構文エラーになりました。

パスの区切りが「/」になっているため copy コマンドではエラーになります。
そのため上記の記述であれば環境依存していないため Linux だろうが Mac でもエラーになりません。

高速化したい場合に手っ取り早いのは GnuWin32 の coreutils for Windows の cp コマンドを
Windows の NDK の prebuilt/windwos/bin か prebuilt/windows-x86_64/bin へ追加して

LOCAL_FILTER_ASM := cp /f

にしてしまえばビルド速度は上がります。

This entry was posted in Android, Android NDK. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>