태그 보관물: Android

Android NDK build architecture 변경하기

아무 설정 없이 ndk를 build 하면 다음과 같이 arm용 library가 만들어진다.

$ <NDK_PATH>/ndk-build 
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Compile thumb  : hello-jni <= hello-jni.c
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/armeabi/libhello-jni.so
$ file obj/local/armeabi/libhello-jni.so 
obj/local/armeabi/libhello-jni.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

NDK에서 build되는 binary의 architecture를 변경하려면 APP_ABI를 선언해 주어야 하는데, Android.mk에 추가해서는 제대로 동작하지 않는다. JNI directory 아래에 Application.mk file을 만들고  APP_ABI값에 build할 architecture를 설정해 준다. 다음은 x86 바이너리를 생성하는 예제이다.

$ cat jni/Application.mk 
APP_ABI := x86
$ <NDK_PATH>/ndk-build 
Gdbserver      : [x86-4.6] libs/x86/gdbserver
Gdbsetup       : libs/x86/gdb.setup
Compile x86    : hello-jni <= hello-jni.c
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/x86/libhello-jni.so
$ file obj/local/x86/libhello-jni.so 
obj/local/x86/libhello-jni.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

* Build에 사용되는 toolchain은 <NDK_PATH>/toolchains/<architecture>-<version>의 형태로 위치한다.