Android-NDK를 이용한 C 소스코드 컴파일 방법
작성자 : sjh21a, mongii(편집)

C언어로 만든 프로그램을 Android terminal shell에서 실행하고자 할 때,

C언어 기반의 local root exploit을 Android에서 돌려보고자 할 때,

혹은 Kernel과 같이 더욱 low한 레벨에서 Android Programming을 하고 싶을 때... 

 

이처럼 간혹 C언어 기반의 프로그램을 Android에서 실행하고 싶을 때가 있습니다. 
 

이 포스팅은 Android-NDK를 이용하여 C 소스코드를 ARM binary로 컴파일하는 방법에 대해 설명합니다.


본 포스팅은 Windows 환경에서 NDK를 사용하는 예제에 대해 설명합니다.
만약 Linux 환경에서의 NDK 사용을 원하신다면 [여기]를 클릭하세요.


Windows에서 NDK를 사용하기 위해 필요한 것들은 다음과 같습니다.

Cygwin은 윈도우즈 OS 위에서 리눅스 환경을 제공하는 프로그램이며,
Android-NDK는 Android 시스템에서 JAVA가 아닌 
C언어 코드를 Cross compile하기 위한 ToolChain입니다.
(NDK는 Native Deveplopment Kit의 약자입니다.)


* Cross compile : 현재 환경과는 플랫폼이 다른 바이너리를 컴파일하는 것 (ex> x86 -> ARM)
* ToolChain : Cross compile 할 때 필요한 툴들의 모음

간혹 Android에서 JAVA 코딩 시 C 라이브러리를 사용해야 할 경우(ex>오디오, 영상처리)가 생기는데,
이런 경우에 JAVA와 C 라이브러리를 연결해주는 JNI(Java Native Interface)라는 것이 필요합니다.

그리고 원래는 이 JNI를 사용하는데 필요한 것이 바로 Android-NDK입니다.
하지만 우리는 Android-NDK에서 cross compile 기능만 이용할 것입니다.

Android-NDK를 사용하기 위해선, 우선 Cygwin을 받아 설치합니다. 
http://cygwin.com에서 설치파일을 받을 수 있습니다.

설치과정은 다른 일반적인 프로그램들의 설치와 비슷하며,
중간에 패키지를 받아 올 미러링 사이트를 고르는 곳이 나오면
jaist과 같이 인터넷 속도가 좋은 곳을 선택합니다. 

(아쉽게도 국내 미러링 사이트는 없으며, 잘 못 선택하면 다운로드에 오랜 시간이 소요되니 조심하세요.)

 

정상적으로 진행되면 다음과 같이 설치할 패키지를 선택하는 화면이 나옵니다.

이 때, make, gcc, binutils, vi 패키지를 꼭 찾아서 설치해주도록 합니다.

 

설치가 완료되면, 바탕화면에 cygwin-terminal 아이콘이 생성됩니다.
그리고 이 아이콘을 더블클릭하면 cygwin이 실행됩니다.

 

 

이렇게하여, cygwin 사용 준비는 완료되었습니다.


다음으로 Android-NDK를 다운받습니다.
(http://developer.android.com/sdk/ndk/index.html)

Android-NDK는 별도의 설치과정 없이 압축만 해제하면 됩니다.

 

이제 Cygwin에서 Android-NDK에 접근할 수 있도록 환경변수 수정을 해 줄 차례입니다.

우선 Cygwin이 설치 된 폴더로 이동하면, home이라는 하위 폴더가 보일 겁니다.

그리고 이 home 폴더로 들어가면 자신의 계정명이 보일 겁니다.

계정명으로 들어가면 .bash_profile 파일이 존재하는데, 이 파일을 다음과 같이 수정합니다.
(파일을 수정할 때엔 메모장, 울트라에디트, 혹은 vi 등 원하는 편집기를 이용합니다.)

 

 

추가 된 내용은 31번째 줄이며, 이는 PATH 환경 변수를 수정하는 부분입니다.

이 때, c:\는 위처럼 /cygdrive/c/로 표시하도록 하고, 나머지 경로는 좀 전에 압축을 풀었던

폴더 경로를 그대로 입력해 줍니다.

 

이제 다시 Cygwin-Terminal을 실행하고, ndk-build를 입력해 봅니다.

좀 전에 ndk-build 파일이 있는 경로를 PATH에 추가했기 때문에 어디서나 실행할 수 있습니다.

 

위처럼 나오면 일단 성공입니다.

 

이렇게하여 cross compile 환경 구축이 모두 완료되었습니다.

이제 본격적으로 실제 C 소스코드를 ARM 바이너리로 컴파일 해봅시다.

 

여기서 한 가지 중요한 점은, JNI라는 디렉토리를 생성한 후, 이 곳에 컴파일 할 C 소스코드를

넣어야한다는 점입니다. 그리고 C 소스코드와 함께 Android.mk 파일도 만들어주어야 합니다.

 

 

다음은 예제 코드인 hello.c 파일의 내용입니다.

그리고 다음은 make 설정 파일인 Android.mk 파일의 내용입니다.

 

[텍스트로 보기]

위에서 $(BUILD_EXECUTABLE) 옵션은 컴파일 될 바이너리를 실행파일 형태로 만들기 위함입니다.

우리는 ARM 바이너리 파일을 생성할 것이기 때문에 항상 BUILD_EXECUTABLE을 사용합니다.

(반면에 라이브러리를 생성하려면, BUILD_SHARED_LIBRARY나 BUILD_STATIC_LIBRARY를 사용합니다.)

 

이처럼 ndk-build를 사용하려면, 항상 위와 같은 폴더 및 파일 구조를 유지하고 있어야 합니다.

 

이제 실제 컴파일을 해보겠습니다.

한 단계 상위 디렉토리로 이동한 후, ndk-build를 입력해 줍니다.

 

 

컴파일이 성공적으로 수행되면, libs/armeabi/ 라는 디렉토리가 생기고, 이 안에 실행 파일이 생성됩니다.

 

 

이제 해당 바이너리를 Android에 올려서 실행해 봅시다.

(adb 사용법은 이미 알고 계신다고 가정합니다.)

 

 

이제 올린 파일에 chmod를 이용하여 실행권한을 준 후 실행을 하면,

 

 

이처럼 ARM 바이너리가 정상적으로 실행되는 것을 볼 수 있습니다.

참고로 컴파일 된 바이너리의 Linking 형태는 기본적으로 Dynamic입니다.

 

# file hello 
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

그 외 NDK와 함께 설치 된 예제 파일들을 보면 더욱 많은 정보를 얻으실 수 있습니다.

 

# ls -al tests/build/
합계 192
drwxr-xr-x 23 124982 5000 4096  7월 14 07:59 .
drwxr-xr-x  6 124982 5000 4096  7월 14 07:59 ..
-rw-r-----  1 124982 5000   15  6월 24 18:45 .gitignore
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 build-assembly-file
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 build-mode
drwxr-xr-x  2 124982 5000 4096  7월 14 07:59 check-armeabi-v7a-prebuilts
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 gnustl-force-all
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 gnustl-force-exceptions
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 gnustl-force-none
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 gnustl-force-rtti
drwxr-xr-x  5 124982 5000 4096  7월 14 07:59 import-install
drwxr-xr-x  5 124982 5000 4096  7월 14 07:59 import-static
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 multi-abi
drwxr-xr-x  5 124982 5000 4096  7월 14 07:59 multi-module-path
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 multiple-static-const
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 ndk-out
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 prebuild-stlport
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 project-properties
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 pthread-rwlock-initializer
drwxr-xr-x  2 124982 5000 4096  7월 14 07:59 short-commands
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 ssax-instructions
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 stdint-c++
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 target-c-includes
drwxr-xr-x  3 124982 5000 4096  7월 14 07:59 test-inet-defs
# ls -al samples/
합계 112
drwxr-x--- 14 124982 5000 4096  7월  3 16:15 .
drwxr-xr-x 13 124982 5000 4096  7월 27 11:13 ..
drwxr-x---  5 124982 5000 4096  6월 24 18:43 bitmap-plasma
drwxr-x---  5 124982 5000 4096  7월 14 08:00 hello-gl2
drwxr-x---  6 124982 5000 4096  6월 24 18:43 hello-jni
drwxr-x---  5 124982 5000 4096  6월 24 18:43 hello-neon
drwxr-x---  3 124982 5000 4096  6월 24 18:43 module-exports
drwxr-x---  4 124982 5000 4096  7월 14 08:00 native-activity
drwxr-x---  6 124982 5000 4096  6월 24 18:43 native-audio
drwxr-x---  5 124982 5000 4096  6월 24 18:43 native-media
drwxr-x---  4 124982 5000 4096  6월 24 18:43 native-plasma
drwxr-x---  5 124982 5000 4096  6월 24 18:43 san-angeles
drwxr-x---  3 124982 5000 4096  6월 24 18:43 test-libstdc++
drwxr-x---  6 124982 5000 4096  6월 24 18:43 two-libs

이제 강력한 프로그래밍 언어인 C언어를 우리의 Android에서 사용할 수 있게 되었습니다.

이것으로 Cygwin과 Android-NDK를 이용한 C 소스코드 컴파일 방법에 대한 설명을 마칩니다.

 

 

24개의 댓글이 달려있습니다.

레인
Jan 08, 2013 10:05
잘 보고 갑니다. 좋은 정보 고맙습니다.

최익필
Jan 13, 2013 12:26
좋은 정보 감사합니다.

Dewi
Jan 23, 2013 12:18
The purchases I make are etnirley based on these articles.

極棘곍뿅둔닉싻먁 克剋롋눺 畇剋 nod32 閨筠곍왈뿅겉궿싻
Feb 19, 2013 12:01
I think you're wrong,

뤢꽥 克戟龜均龜 곍분겉눺겉귂 閨筠곍왈뿅겉궿싻
Feb 19, 2013 12:05
I believe that it is not,

곍분겉눺겉귂 克剋롋눺 nod32 smart security
Feb 19, 2013 12:10
I think you're wrong,

克戟龜均龜 귂筠戟龜戟均龜 곍분겉눺겉귂 閨筠곍왈뿅겉궿싻
Feb 19, 2013 12:13
Why is everything so difficult?,

克戟龜均龜 귂筠戟龜戟均龜 곍분겉눺겉귂 閨筠곍왈뿅겉궿싻
Feb 19, 2013 12:14
Why is everything so difficult?,

戟龜克龜궿먁 롋龜橘 克戟龜均龜 곍분겉눺겉귂
Feb 19, 2013 12:18
Very interesting. I think you can and stay.,

nod32 antivirus 4 克剋롋눺 2012
Feb 19, 2013 12:27
May be enough news on this subject?,

nod32 antivirus 4 克剋롋눺 2012
Feb 19, 2013 12:27
May be enough news on this subject?,

克棘畇 克剋롋눺 nod32
Feb 19, 2013 12:32
Very interesting. I think you can and stay.,

nod32 internet security 克剋롋
Feb 19, 2013 12:36
Excellent site! Thank you!,

棘戟筠均龜戟 곍분겉눺겉귂 克戟龜均
Feb 19, 2013 12:41
I'm sure it will interest many,

克戟龜均逵 鈞逵克棘戟逵 곍분겉눺겉귂
Feb 19, 2013 12:46
Why is everything so difficult?,

克戟龜均龜 極剋筠댭겆분압꽥 곍분겉눺겉귂
Feb 19, 2013 12:55
original news,

克剋롋눺 逵閨棘눺먁 畇剋 棘閨戟棘勻剋筠戟龜 nod32
Feb 19, 2013 12:59
May be enough news on this subject?,

克剋롋눺 nod32 datamix
Feb 19, 2013 01:04
Excellent site! Thank you!,

곍꽥둔뙨먁 克剋롋눺 逵戟궿먁꽥먈꺫 nod32 閨筠곍왈뿅겉궿싻
Feb 19, 2013 01:08
I think you're wrong,

곍분겉눺겉귂 克戟龜均 눺둘戟뗊 均棘棘畇
Feb 19, 2013 01:13
cognitive news,

곍분겉눺겉귂 克戟龜均 눺둘戟뗊 均棘棘畇
Feb 19, 2013 01:13
cognitive news,

곍분겉눺겉귂 克戟龜均龜 極棘 筠劇棘戟귂 閨筠곍왈뿅겉궿싻
Feb 19, 2013 01:21
Where can I get myself the same?,

곍왈앗 克戟龜均龜 곍분겉눺겉귂
Feb 19, 2013 01:26
cognitive news,

아이윤맨
Dec 11, 2018 08:14
혹시 CPP나 API,MFC,DirectX도 되나요?


 댓글 남기기

ID Password
   
Hit : 35041  

Copyright(C) HACKERSCHOOL All Rights Reserved.