본문 바로가기

Programming/Android

NDK를 사용하지 않고 C source build

안드로이드에서 native C source는 보통 NDK를 사용하여 빌드한다.

그러나 종종 open source 등 기존의 코드를 재활용하고 싶을 때가 있다.

매번 source code를 NDK에서 요구하는 Android.mk 형태로 바꾸어서 빌드할 수 없는 노릇이다.


해서 찾아봤다. NDK 없이 일반 MakeFile을 이용하여 기존 source code를 cross-compile 할 수 있는 방법을 말이다.

해당 내용은 아래에서 발췌하였다.

https://developer.android.com/ndk/guides/standalone_toolchain?hl=ko

고급 방법

NDK는 명령줄에서 사용자 지정 툴체인 설치를 수행할 수 있는 make-standalone-toolchain.sh 셸 스크립트를 제공합니다. 이 접근 방식에서는 간단한 방법에 설명되어 있는 절차보다 더 큰 유연성을 발휘할 수 있습니다.

이 스크립트는 $NDK/build/tools/ 디렉터리에 있으며, 여기서 $NDK는 NDK의 설치 루트 디렉터리입니다. 이 스크립트의 사용 예는 아래에 나와 있습니다.

$NDK/build/tools/make-standalone-toolchain.sh \ --arch=arm --platform=android-21 --install-dir=/tmp/my-android-toolchain

이 명령어를 실행하면 /tmp/my-android-toolchain/이라는 이름의 디렉터리가 생성되고, 이 디렉터리에는 android-21/arch-arm sysroot의 복사본과 32비트 ARM 아키텍처용 툴체인 바이너리의 복사본이 포함됩니다.

툴체인 바이너리는 호스트별 경로에 종속되지 않거나 이러한 경로를 포함하지 않습니다. 즉, 어떤 위치에든 이러한 바이너리를 설치하거나, 필요하다면 이동할 수도 있습니다.

기본적으로, 빌드 시스템은 32비트 ARM 기반 GCC 4.8 툴체인을 사용합니다. 하지만 --arch=<toolchain>을 옵션으로 지정하여 다른 값을 지정할 수 있습니다. 표 3은 다른 툴체인에 사용할 값을 나타냅니다.


위에서 처럼 make-standalone-toolchain.sh를 사용하여 새로이 toolchain을 만들어 내는 방법이 있다.

arch 및 android version을 기입하고 경로를 지정하면 그곳에 toolchain 및 sysroot를 만들어 준다.


이제부터는 해당 경로를 PATH에 지정하고 sysroot 등을 지정하여 기존 MakeFile로 빌드할 수 있다.


참고)

빌드중 다음과 같은 에러가 발생하면 'PIE' 옵션을 추가해서 빌드하면 된다.

error: only position independent executables (PIE) are supported.


CFLAGS += -fPIE

LDFLAGS += -fPIE -pie