#+TITLE: Building a binary for Android

Often enough, I'd like to write and run some simple native code on my
phone as a test. The simplest way is to just create a new project with
Android Studio, but that occasionally seems a bit too heavy for my
purposes.

This post describes a reasonably simple alternative that's not tied to
a specific IDE, running gradle or forcibly deploying an appliction
(except for Android N+).

Assuming that $PROJECT is the parent directory.

* $PROJECT/jni/Android.mk - documentation
#+BEGIN_SRC BSDMakefile
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS += -Wall

LOCAL_LDLIBS := -llog -g

LOCAL_C_INCLUDES := bionic

# Name the binary
LOCAL_MODULE := somebinary

# List out source files here
LOCAL_SRC_FILES := ../main.c

include $(BUILD_EXECUTABLE)
#+END_SRC

* $PROJECT/jni/Application.mk - documentation
#+BEGIN_SRC BSDMakefile
APP_MODULES := somebinary
APP_OPTIM := release
APP_PLATFORM := android-15
APP_PIE := true
APP_ABI := armeabi-v7a
#+END_SRC

* $PROJECT/main.c
#+BEGIN_SRC c
#include <stdio.h>

int main(int argv, char** argc) {
  printf("Hello, Android!");
  return 0;
}
#+END_SRC

* (Optional) $PROJECT/run.sh
I like to have a simple shell file that I can trigger to execute the
app for me - which I use as the emacs M-x compile command.

#+BEGIN_SRC sh
#!/bin/zsh
set -e

alias adb=/opt/android_sdk/platform-tools/adb

echo "Building..."
/opt/android_ndk/android-ndk-r13b/ndk-build

echo "Push..."
adb push libs/armeabi-v7a/somebinary /data/local/tmp/

echo "Run...\n"
adb shell /data/local/tmp/somebinary
#+END_SRC

** ndk-build - documentation
This is a helpful wrapper script that runs the appropriate cross
compilers, greatly simplifying the makefiles here. The only annoying
side effect is the need to store everything in a jni folder, which I'm
sure is configurable in a way I haven't quite found yet.