서브메뉴

본문

안드로이드의 모든 것 NDK (C/C++을 이용한 안드로이드 앱 개발 방법)
안드로이드의 모든 것 NDK (C/C++을 이용한 안드로이드 앱 개발 방법)
저자 : 고현철|전호철
출판사 : 한빛미디어
출판년 : 2012
ISBN : 9788979149593

책소개

앱의 기본 개념부터 설명한 친절한 NDK 안내서!

C/C++을 이용한 안드로이드 앱 개발 방법『안드로이드의 모든 것 NDK』. 안드로이드 앱 개발에 네이티브 라이브러리 기능을 추가하거나 자바와 안드로이드 프레임워크 연동이 궁금한 개발자를 대상으로 한 책이다. 실제 NDK로 프로젝트를 하는 개발자와 개발자를 대상으로 강의해온 강사가 함께 개발자를 위해 가장 쉬운 언어로 풀어서 NDK를 설명했다. 안드로이드 NDK로 개발한 동적 로딩 라이브러리를 자바 애플리케이션에서 호출하여 사용하는 방법뿐만 아니라, NDK에 포함되지 않은 안드로이드 프레임워크의 리소스를 사용하는 방법도 다루고 있다. 또한 실제 안드로이드의 프레임워크가 작동하는 방식과 유사한 서비스를 만들면서 커널 드라이버까지 접근하여 하드웨어 조작까지 할 수 있도록 설명한다. 처음 안드로이드를 접하는 독자를 위해 안도로이드에 대해 선행 학습할 수 있는 부록을 제공한다.
[교보문고에서 제공한 정보입니다.]

출판사 서평

이 책이 제시하는 핵심 내용

JNI를 이용하는 NDK를 이용해서 안드로이드의 성능에 최적화된 고성능 앱을 개발해보자.

이 책의 특징과 장점

앱의 기본 개념부터 설명한 친절한 NDK 집필서

자바로 안드로이드 앱을 개발하다가 네이티브 기능을 활용하려고 했지만, 무엇부터 해야 할지 몰랐던 개발자에게 꼭 필요한 책이다. 실제 NDK로 프로젝트를 하는 개발자와 수 차례 개발자를 대상으로 강의를 한 강사가 함께 개발자를 위해 가장 쉬운 언어로 풀어서 NDK를 설명했다.
처음 안드로이드를 접하는 독자라면 부록의 ‘안드로이드란 무엇인가’를 선행 학습하고, NDK부터 궁금한 독자는 0장부터 정주행을, NDK의 활용이 궁금한 독자라면 몇 개장을 건너 뛰고 뒷 부분을 학습하면 된다.

『안드로이드의 모든 것 NDK』 온라인 질답 게시판 운영
책을 읽다가 막히거나 궁금한 부분이 있다면 주저하지 말고 질문하자. 친절한 저자들이 직접 설명해준다.

어떤 독자를 위한 책인가?

안드로이드 앱 개발에 네이티브 라이브러리 기능을 추가하려는 개발자
자바와 안드로이드 프레임워크 연동이 궁금한 개발자
안드로이드를 공부하려는 학생

책 소개

이 책에서는 단지 안드로이드 NDK로 개발한 동적 로딩 라이브러리를 자바 애플리케이션에서 호출하여 사용하는 방법에 그치지 않고, NDK에 포함되지 않은 안드로이드 프레임워크의 리소스를 사용하는 방법도 다루고 있으며 실제 안드로이드의 프레임워크가 작동하는 방식과 유사한 서비스를 만들면서 커널 드라이버까지 접근하여 하드웨어 조작까지 할 수 있도록 설명한다.

『안드로이드의 모든 것 분석과 포팅』(2011) 집필진의 두 번째 책
전작 『안드로이드의 모든 것 분석과 포팅』이 안드로이드 운영체제를 배운 후 사운드, 카메라, GPS 등을 철저히 분석하고 포팅을 다루는 책이라면 『안드로이드의 모든 것 NDK』는 자바로 안드로이드 애플리케이션을 작성하다가 막히는 독자에게 잘 알려지지 않은 저자의 노하우를 친절하게 알려준다. 마법 같은 NDK로 안드로이드의 네이티브 라이브러리를 활용해보자.

지은이의 말

안드로이드 초창기 개발자들은 대부분 PDK로 포팅을 하거나 SDK로 애플리케이션을 개발했습니다. 하지만 PDK는 단말 제조사 외에는 소스 레벨에 접근하지 못하고, SDK는 자바만을 이용해야 했습니다. 그런 터라 기존에 작업했던 여러 애플리케이션에서 사용한 라이브러리와 C/C++로 작성된 좋은 프로그램을 활용할 방법이 없었습니다. 이후, 안드로이드 버전이 조금씩 높아지면서 C/C++ 라이브러리를 이용할 수 있는 NDK(Native Development Kit)를 구글에서 마련했습니다. 하지만 NDK의 활용 자료는 몇몇 인터넷 문서와 소수 개발자가 공개한 몇몇 프로그램 정도뿐이었습니다(예. github.com의 프로젝트).
저는 기존 개발 방식과 더불어 최근 새롭게 나타나는 다양한 기술을 NDK를 이용해서 활용할 수 있도록 정리하고자 이 책을 썼습니다.
사실 『안드로이드의 모든 것 NDK』는 『안드로이드의 모든 것 분석과 포팅』과 같은 시기에 출간하려고 했습니다. 그런데 여러 가지 개인적인 문제가 생겨서 NDK는 포기하고 분석에 관련된 책만 출간했었습니다. 이 때문에 책의 기획과 편집을 맡아주신 한빛미디어 출판사 담당자에게 공연히 불만의 소리가 향했던 것으로 알고 있습니다. 실제로 『안드로이드의 모든 것 분석과 포팅』에 ‘분석’이 붙었는데, ‘이게 뭐가 모든 것이냐?’라는 반응도 있었습니다. 사실 기획자는 ‘안드로이드의 모든 것’이란 연작 시리즈를 기획했는데, 책을 내겠다고 찾아갔던 저자가 약속을 어겨버렸으니 본의 아니게 사기(?)를 친 셈이 되었습니다. 저도 죄송한 마음에, 창피하지만 아무 소리도 못하고 그냥 ‘에라 모르겠다, 나도 바빠서 죽을 지경인데 머...... (ㅠ.ㅠ)’하고 지냈습니다. 그러다가 올해 초에 여유가 생기면서 기존에 NDK 강의를 하던 전호철 씨와 예전에 작업했던 NDK 강의 교안을 바탕으로 일반 멀티미디어 부분을 합쳐서 출간했으면 하는 의향을 출판사에 전달했습니다. 다행히 흔쾌히 허락해주셔서 이 책을 진행하게 되었습니다.
예전 『안드로이드의 모든 것 분석과 포팅』을 작업할 때도 ‘책이 출간되는 동안 안드로이드 버전이 바뀌면 어떡하나, 너무 책을 어렵게 쓰지 않았나!’ 걱정을 많이 했는데, 아니나 다를까 이번 책을 집필하는 도중에 젤리빈 버전이 ‘떡!’ 나왔습니다. 하지만 다행히도 PDK와는 달리 NDK는 안드로이드 버전에 의존성이 약한 편이어서 버전이 바뀌어도 이전 자료로 작업을 하는 데 큰 문제가 생기지 않았습니다.
이 책에서는 기본적인 NDK뿐만 아니라, PDK 라이브러리를 이용해서 NDK를 작업하는 부분과 안드로이드의 멀티미디어를 NDK로 작업할 수 있는 부분을 담았습니다. 또 안드로이드의 새로운 특징을 이용할 수 있게 주제를 확장해서 작업했습니다(예. OpenSL ES, OpenMAX AL 등).
이 책을 출간함으로써 안드로이드의 네 가지 큰 주제(리눅스 커널, 안드로이드 PDK, NDK, SDK) 중 두 가지를 정리했습니다. 나머지는 정리가 필요하지 않거나(SDK), 불가능(리눅스 커널)하기 때문에 개인적으로는 기본 정리는 어느 정도 마무리되었다고 생각합니다.
끝으로 책을 출간할 때마다 항상 편집, 교정을 해주시는 유형목 님과 조희진 님께 감사의 말씀 드립니다.
_고현철

2008년쯤 AESOP의 고현철 님을 통해 안드로이드를 처음 접했습니다. 그 당시에 고현철 님은 삼성 6410을 붙인 보드에 안드로이드를 올려서 무언가 작업을 하고 계셨던 것 같습니다. 하루는 사무실에 놀러 간 적이 있었는데 그 동안 안드로이드 카메라 부분을 분석하신 내용을 저에게 마구 마구 설명해주셨던 기억이 납니다. 그 즈음 저도 안드로이드 개발에 첫 걸음을 내디뎠던 것 같네요.
폭풍 같은 설명이 지나가고, 학교 연구실로 돌아가서 고현철 님이 보내준 분석 자료를 다시 보았습니다. 그런데 그때 카메라 코드 중에 도저히 알 수 없는 코드가 있더군요. 인터넷에 검색해도 잘 안 나오고 그래서 그 당시에는 정확한 뜻을 알지 못한 채 대충 감으로 ‘아~ 아마 이 부분은 대충 이렇게 연결될 것 같다’하고 넘어갔습니다. 그런데 1년쯤 뒤에 NDK와 JNI를 공부하면서 그 내용을 명확하게 알게 되었습니다(Camera의 자바 부분과 Native Camera의 연결 포인트에 대한 내용이었습니다).
그리고 한참 시간이 흘러 다니던 대학원을 잠시 접고 고현철 님을 따라서 안드로이드 멀티미디어관련 일을 하게 되었습니다. 그러던 차에 구글이 NDK를 배포했고 냉큼 다운받아서 돌려보았습니다. 당시 느낀 느낌을 그대로 설명하자면 ‘아니! 도대체 이걸로 뭐 하라는 거임?’이였습니다. 제 기억으로는 최초 NDK에는 단순히 툴 체인만 들어있고 예제도 달랑 두 개였습니다. 그래서 별 필요 없다고 생각하고 접어두었는데 몇 달이 지난 후에서야 ‘아차!’ 싶었습니다. 같이 일을 도와주시던 최종환 님이 검색 중에 NDK를 사용해서 진행 중인 여러 가지 프로젝트를 찾아서 보여주셨는데 NDK 툴 체인을 사용해서 SDL을 안드로이드에 포팅한 것, OpenCV를 포팅한 것 등이었습니다. ‘난 그냥 별거 아니라고 생각하고 접었던 NDK를 가지고 외국 개발자는 이렇게 다양하게 사용하고 있구나’하는 생각이 번뜩 들었습니다. 역시 뭘 알아야 이게 똥인지 된장인지 판단하고 써 먹는다는 것을 새삼 다시 한번 깨달았습니다. 그때부터 NDK와 NDK에 사용되는 핵심 기술인 JNI에 대해서 여러 가지를 조사하고 공부했습니다. 그리고 드디어 이 책을 내게 되었습니다.
NDK에서 사용하는 JNI는 안드로이드의 외형인 자바와 안드로이드의 내부의 C++ 네이티브 라이브러리를 연동하는 데 핵심이 되는 기술입니다. 안드로이드에서 지원하지 않는 기능(예를 들자면 DMB나 멀티미디어 플레이어/코덱/파서 등)을 사용하여 애플리케이션과 연결하려면 반드시 필요한 기술입니다. 전체적인 안드로이드 구조를 그릴 때도 이 부분을 알면 훨씬 이해가 빠를 수 있습니다. 왜냐하면 NDK를 이용한다는 것 자체가 안드로이드 애플리케이션에서부터 내부에서 사용하는 라이브러리까지의 분석을 의미하는 것이기 때문입니다. 그리고 JNI는 안드로이드에만 국한되지 않고 기존의 자바 환경에서도 똑같이 사용되므로 이것을 안다는 것은 훨씬 강력한 자바 애플리케이션을 만들 수도 있다는 의미가 될 수도 있습니다.
저는 그동안 NDK를 주제로 다룬 많은 강의를 진행해왔습니다. 강의를 처음 시작하던 때와는 달리 현재는 NDK에도 많은 내용이 추가되었고 구글이 공개한 내용 이외에 많은 기초 자료도 보강한 상태에서 그 강의에 사용하던 자료를 한데 모아 이 책을 내게 되었습니다. 이 책을 쓰던 시점이 진저브레드에서 아이스크림 샌드위치로 넘어가는 시점이어서 많은 내용을 다시 쓰고 병행해 담기도 하였습니다. 그리고 Surface를 사용하는 부분은 진저브레드에서 아이스크림 샌드위치로 넘어가면서 거의 대부분의 코드가 변경되었기에, 많이 수정하고 새롭게 만드느라 고생했습니다. 특히 이 부분은 안드로이드 네이티브에서 Surface를 활용하기를 원하시는 분들에게 많은 도움이 될 거라고 자부합니다. 또한 다른 책에서는 볼 수 없는 멀티미디어 기능에 대한 내용도 있기 때문에 관련 지식이 조금 있으신 분들에게 많은 도움이 되리라 생각합니다. 회사 일을 하면서 책도 쓰는 바람에 시간이 많이 들기도 했지만 오랜 기간 썼기 때문에 더 많은 내용을 담을 수도 있었습니다. 처음 내는 책이라 막상 책이 나올 시점이 되니 두려움이 많이 앞섭니다. 혹시나 책이 나온 후 내용이 부실하다고 욕먹지는 않을지 하는 걱정도 듭니다. 하지만 한편으로는 시중에 나와 있는 NDK/JNI 관련된 책 중에 제 책보다 유용한 자료와 코드가 많은 것은 없다는 자신감도 없지 않아 있습니다. 제가 쓴 이 책의 내용이 많은 분들께 도움이 되었으면 좋겠습니다.
처음 내는 책이라 감사드릴 분들이 많아서 감사 인사를 약간 길게 남기겠습니다.
제일 먼저, 저에게 이런 책을 낼 수 있는 기회를 제공해주시고 처음 이 분야로 발을 내디딜 때부터 지금까지 많은 가르침과 충고를 해주시고 좋은 술도 많이 많이 사주시는 고현철 님께 깊은 감사드립니다. 책을 감수해주시고 디버깅 파트를 써주신 유형목 님께도 감사드립니다. 이 책을 낼 수 있도록 많은 도움을 주신 우리 인시그널 식구 분들께도 감사드립니다. 옛날 놀고 있던 대학교 4학년 여름 방학 때 임베디드 로봇 알바를 소개시켜주신 한영민 형님께도 감사드립니다. 처음 NDK/JNI 공부할 때 같이 자료를 찾아주시고 첫 강의를 같이 들어갔던 최종환 형님께도 감사드립니다. 마지막으로 어려운 환경에서 뒷바라지 해주시는 부모님과 동생에게 감사하고 사랑한다는 말을 전합니다.
_전호철

추천사

NDK는 안드로이드에서 asm/C/C++ 라이브러리를 직접 이용할 수 있도록 해주는 툴입니다. 따라서 기존에 안드로이드가 아닌 C/C++ 환경에서 개발된 애플리케이션을 안드로이드로 포팅할 때 UI 부분을 자바로 작성하고 하단 부분은 기존 라이브러리를 그대로 이용하는 형태의 개발이 가능합니다. PDK와 함께 이용하면 더 저수준의 동작까지 원하는 대로 제어할 수 있습니다.
모두 아시겠지만 안드로이드는 리눅스를 기반으로 하고 있으며 그 소스 코드 또한 공개되어 있기에 NDK와 PDK는 이러한 오픈 소스의 장점이 가장 잘 발휘되는 부분이라고도 생각합니다. 게다가 한국에는 게임을 포함하여 기존에 C/C++로 개발된 우수한 애플리케이션이 많습니다.
이러한 상황에서 NDK와 PDK에 관해 자세한 내용을 다루는 책의 발간은 제게는 굉장히 특별하고 기쁜 일입니다. 오랫동안 리눅스와 오픈 소스 관련 업계에 종사하며 쌓은 저자의 관록이 이 책에 잘 녹아들었다고 생각합니다. 『안드로이드의 모든 것 NDK』를 통해서 다른 곳에서는 상대적으로 잘 다루지 않는 안드로이드의 좀 더 깊은 곳까지 이해한다면 남들보다 한발 앞서 더욱 좋은 개발자로 성장할 기회를 잡으리라 생각합니다.
_권순선, Google/KLDP
[교보문고에서 제공한 정보입니다.]

목차정보

CHAPTER 00 들어가며

CHAPTER 01 안드로이드 NDK는 무엇인가?

__1.1 안드로이드 NDK의 등장 배경
__1.2 NDK에서 제공되는 것
__1.3 개발 환경
____1.3.1 JDK 설치
____1.3.2 안드로이드 SDK 설치
____1.3.3 이클립스와 ADT 플러그인 설정
____1.3.4 NDK 개발 환경 설정
____1.3.5 PDK 설정
__1.4 안드로이드 개발 방법
____1.4.1 SDK를 이용한 개발 방법
____1.4.2 NDK를 이용한 개발 방법
____1.4.3 PDK를 이용한 개발 방법 소개 및 동작 구조
____1.4.4 Android Debug Bridge

CHAPTER 02 NDK 개발을 위한 안드로이드 애플리케이션 기초 쌓기
__2.1 안드로이드 애플리케이션의 구조
__2.2 안드로이드 애플리케이션 구성 요소
____2.2.1 액티비티
____2.2.2 서비스
____2.2.3 BroadcastReceiver
____2.2.4 ContentProvider
____2.2.5 인텐트
__2.3 안드로이드 애플리케이션의 라이프 사이클
____2.3.1 액티비티 라이프 사이클
____2.3.2 서비스 라이프 사이클
____2.3.3 BroadcastReceiver 라이프 사이클
__2.4 안드로이드 애플리케이션의 퍼미션

CHAPTER 03 본격 NDK 개발!
__3.1 네이티브 라이브러리 개발을 위해 알아야 할 것
__3.2 JNI
____3.2.1 JNA
____3.2.2 SWIG
____3.2.3 JNI
__3.3 JNI 구현 순서
__3.4 자바에서 네이티브 코드 호출하기
__3.5 네이티브 코드에서 자바로 접근하기
__3.6 x86에서 JNI 연습
__3.7 안드로이드 Makefile
____3.7.1 Android.mk 분석
____3.7.2 Application.mk 분석
__3.8 C와 C++에서 JNI 구현 시 차이점
__3.9 SDK, NDK, PDK 로그 출력
____3.9.1 SDK 로그 출력
____3.9.2 NDK 로그 출력
____3.9.3 PDK 로그 출력
__3.10 예제1: 더하기 프로그램
____3.10.1 안드로이드 새 프로젝트 생성하기
____3.10.2 자바 애플리케이션의 기본 레이아웃 변경하기
____3.10.3 자바 코드 수정하기
____3.10.4 JNI 규약에 맞는 라이브러리 생성하기
____3.10.5 .c 파일을 만들고 컴파일하기
__3.11 예제2: 외부 라이브러리 활용하기
__3.12 라이브러리 의존성 문제
__3.13 JNI_OnLoad
__3.14 한글 처리
__3.15 자바와 NDK의 속도 차이
__3.16 네이티브 스레드로 자바 콜백 만들기
__3.17 안드로이드 디버깅
____3.17.1 addr2line
____3.17.2 gdb를 이용한 디버깅
____3.17.3 프로파일링

CHAPTER 04 NDK에서의 그래픽 처리
__4.1 bitmap-plasma
__4.2 NDK 3D
____4.2.1 자바 애플리케이션에서의 OpenGL ES 사용
____4.2.2 NDK에서의 OpenGL ES 1.x
__4.3 SDL 포팅
____4.3.1 SDL이란 무엇인가?
____4.3.2 안드로이드 자바와 SDL의 연결
____4.3.3 SDL 활용
__4.4 Native Activity
____4.4.1 프레임워크 내부와 연결점
____4.4.2 Native Activity를 만들어 보자
__4.5 STL과 Neon의 사용
____4.5.1 STL
____4.5.2 NEON

CHAPTER 05 NDK의 확장
__5.1 플랫폼 안에서 사용되는 네이티브 라이브러리
__5.2 NDK용 Android.mk와 전체 소스용 Android.mk의 차이점
__5.3 skia 라이브러리로 애플리케이션 만들기
__5.4 안드로이드 전체 소스 컴파일 방법
__5.5 자바 애플리케이션에서 GPIO 컨트롤하기

CHAPTER 06 멀티미디어
__6.1 안드로이드 네이티브 AudioFlinger 활용과 OpenSL ES
__6.1.1 네이티브 AudioFlinger 제어
__6.1.2 OpenSL ES
__6.2 네이티브에서 Surface 접근하기
____6.2.1 안드로이드처럼 직접 Surface를 사용하려면 어떻게 해야 할까?
____6.2.2 테스트용 애플리케이션
__6.3 OpenMAX AL
____6.3.1 OpenMAX AL 개요
____6.3.2 동작 구조
____6.3.3 안드로이드 OpenMAX AL
____6.3.4 OpenMAX AL 예제
__6.4 안드로이드에서 FFmpeg 활용
____6.4.1 안드로이드 멀티미디어 구조
____6.4.2 안드로이드 프레임워크에서의 멀티미디어
____6.4.3 안드로이드 애플리케이션 계층에서의 멀티미디어
____6.4.4 FFmpeg 개요
____6.4.5 FFmpeg의 구성
____6.4.6 안드로이드 FFmpeg

APPENDIX 안드로이드는 무엇인가?
__A.1 안드로이드의 개념
__A.2 안드로이드 역사
__A.3 안드로이드 특징
__A.4 안드로이드 라이선스와 오픈 소스 라이선스
____A.4.1 Dalvik VM
__A.5 안드로이드 시스템 구조
__A.6 우분투와 VirtualBox로 NDK 개발 환경 설정하기
[교보문고에서 제공한 정보입니다.]