책 소개
[ 소개 ]
안드로이드의 네이티브 세계를 발견하고 애플리케이션에 C/C++의 강력함을 더한다!
안드로이드 NDK는 앱의 성능을 개선하기 위해 탄생했다. 고성능 코드와 이식성 있는 코드를 사용해 모바일 기기의 최대 성능을 발휘한다.
이 책은 C/C++가 적용된 애플리케이션을 생성하고 자바로 통합하기 위한 방법을 설명한다. 네이티브 API에 접근하는 방법과 가장 성공적인 안드로이드 애플리케이션에 사용된 라이브러리를 포팅하기 위한 방법을 배운다.
실용적인 단계별 예제와 중요한 내용, 기법 등을 통해 자바 애플리케이션이나 독립 애플리케이션에 추가된 C++ 코드를 구동하기 위한 방법을 살펴본다.
[ 이 책에서 다루는 내용 ]
■ 자신만의 첫 번째 안드로이드 네이티브 프로젝트 생성
■ 자바 네이티브 인터페이스를 이용해 자바와 통신
■ OpenGL ES를 이용한 2D/3D 그래픽 디스플레이
■ OpenSL ES를 이용한 사운드와 음악 재생
■ 안드로이드 입력과 센서 관리
■ 네이티브 애플리케이션을 디버깅하고 문제 해결
■ 기존 C/C++ 코드를 안드로이드로 포팅
■ 애플리케이션에 그래픽과 사운드, 센서, 물리 통합
[ 이 책의 대상 독자 ]
더욱 강력한 성능을 필요로 하는 안드로이드 자바 프로그래머인가? 자바에 대해 잘 모르거나 가비지 컬렉터(garbage collector)에 신경 쓰지 않는 C/C++ 개발자인가? 고성능의 멀티미디어 애플리케이션이나 게임을 개발하고자 하는가? 이 질문 중 어느 하나라도 해당된다면 기본적인 C/C++ 지식을 활용해 네이티브 안드로이드 개발의 세계로 뛰어드는 데 이 책을 유용하게 활용할 수 있다.
[ 이 책의 구성 ]
1장, '개발 환경 설정'에서는 안드로이드 NDK 애플리케이션을 개발하는 데 필요한 도구들을 소개하고, 개발 환경과 안드로이드 기기 연결, 안드로이드 에뮬레이터의 설정 방법을 살펴본다.
2장, '네이티브 프로젝트 생성, 컴파일, 배포'에서는 NDK 예제 컴파일과 패키지화, 배포에 대해 살펴보고, 이클립스와 NDK로 첫 번째 자바/C 하이브리드(hybrid) 프로젝트를 생성한다.
3장, 'JNI를 이용한 자바와 C/C++ 인터페이스'에서는 자바 네이티브 인터페이스(JNI)를 사용해 자바, C/C++ 간 통합과 통신 과정을 살펴본다.
4장, '네이티브 코드에서 자바 콜백 호출'에서는 양방향(bidirectional) 통신을 통해 네이티브에서 그래픽 비트맵을 처리한 후 C에서 자바를 호출하는 과정을 살펴본다.
5장, '완전한 네이티브 애플리케이션 작성'에서는 안드로이드 NDK 애플리케이션의 생명주기를 살펴보고, 자바 없는 완전한 네이티브 애플리케이션을 작성해본다.
6장, 'OpenGL ES로 그래픽 렌더링'에서는 OpenGL ES를 이용해 고급 2D/3D 그래픽을 최고의 성능으로 그리는 방법을 소개한다. 디스플레이 초기화, 텍스처(texture) 불러오기, 스프라이트(sprite) 그리기, 버텍스(vertex)와 메시(mesh)를 표시할 인덱스 버퍼 할당 등의 내용을 다룬다.
7장, 'OpenSL ES로 사운드 재생'에서는 안드로이드 NDK에서만 제공하는 특별한 기능인 OpenSL ES를 이용해 네이티브 애플리케이션에 음악 차원(dimension)을 추가하는 방법과 사운드 녹음 후 스피커로 재생하는 방법을 다룬다.
8장, '입력 기기와 센서 처리'에서는 안드로이드 기기와 멀티터치 화면 간 상호작용을 살펴본다. 네이티브 애플리케이션으로 키보드 이벤트를 처리하고, 센서 제어 방법을 확인한 후 기기를 게임 컨트롤러로 활용할 수 있는 방법을 살펴본다.
9장, '안드로이드에 기존 라이브러리 포팅'에서는 필수적인 C/C++ 프레임워크(STL과 Boost)를 컴파일하고, 예외 처리와 RTTI(RunTime Type Information, 런타임 동안 해당 타입에 대한 정보 확인을 위해 사용)를 활성화시키는 방법을 살펴본다. Irrlicht 3D 엔진과 Box2D 물리 엔진 같은 라이브러리나 서드파티 라이브러리를 안드로이드로 포팅하는 방법도 살펴본다.
10장, '전문 게임 개발'에서는 Irrlicht와 Box2D를 사용해 터치스크린과 센서를 제어하는 3D 게임을 개발한다.
11장, '디버깅과 문제 해결'에서는 NDK 디버그 유틸리티를 이용해 실행 애플리케이션의 상세 분석 과정과 애플리케이션의 크래시 덤프(crash dump)를 분석하고, 성능을 측정해본다.
목차
목차
- 1 개발 환경 설정
- 안드로이드 개발 시작
- 윈도우 설정
- 실습 예제 | 안드로이드 개발용 윈도우 환경 준비
- 윈도우에 안드로이드 개발 킷 설치
- 실습 예제 | 윈도우에 안드로이드 SDK/NDK 설치
- 맥OS X 설정
- 실습 예제 | 맥OS로 안드로이드 개발 준비
- 맥OS X에서 안드로이드 개발 킷 설치
- 실습 예제 | 맥OS X에서 안드로이드 SDK와 NDK 설치
- 리눅스 설정
- 실습 예제 | 안드로이드 개발을 위한 우분투 리눅스 준비
- 리눅스에 안드로이드 개발 킷 설치
- 실습 예제 | 우분투에 안드로이드 SDK/NDK 설치
- 이클립스 개발 환경 설정
- 실습 예제 | 이클립스 시작
- 안드로이드 에뮬레이트
- 실습 예제 | 안드로이드 가상 장치 생성
- 윈도우와 맥OS X에서 안드로이드 기기 개발
- 실습 예제 | 윈도우와 맥OS X에서 안드로이드 기기 설정
- 리눅스에서 안드로이드 기기 개발
- 실습 예제 | 우분투에서 안드로이드 기기 설정
- 개발 기기 문제 해결
- 정리
- 2 네이티브 프로젝트 생성, 컴파일, 배포
- NDK 예제 애플리케이션 컴파일과 배포
- 실습 예제 | hellojni 예제 컴파일과 배포
- 안드로이드 SDK 도구
- 안드로이드 디버그 브리지
- 프로젝트 설정 도구
- 이클립스로 첫 번째 안드로이드 프로젝트 생성
- 실습 예제 | 자바 프로젝트 초기화
- 달빅 소개
- 자바와 C/C++ 간 인터페이스
- 실습 예제 | 자바에서 C 코드 호출
- Makefile
- 이클립스에서 네이티브 코드 컴파일
- 실습 예제 | 하이브리드 자바/C/C++ 프로젝트 작성
- 정리
- NDK 예제 애플리케이션 컴파일과 배포
- 3 JNI를 이용한 자바와 C/C++ 인터페이스
- 자바 기본 데이터 타입
- 실습 예제 | 네이티브 키/값 저장소 빌드
- 네이티브 코드에서 자바 객체 참조
- 실습 예제 | Store 내의 객체 레퍼런스 저장
- 지역 레퍼런스와 전역 레퍼런스
- 네이티브 코드에서 예외 전달
- 실습 예제 | Store에서 예외 발생시키기
- C++에서의 JNI
- 자바 배열 처리
- 실습 예제 | Store에서 객체 레퍼런스 저장
- JNI 예외 확인
- 정리
- 자바 기본 데이터 타입
- 4 네이티브 코드에서 자바 콜백 호출
- 자바와 네이티브 스레드 동기화
- 실습 예제 | 백그라운드 스레드 실행
- 스레드 연결과 분리
- 자바와 네이티브 코드 생명주기
- 네이티브 코드에서 자바 콜백 호출
- 실습 예제 | 네이티브 스레드에서 자바 코드 호출
- 콜백
- JNI 메소드 정의
- 네이티브에서 비트맵 처리
- 실습 예제 | 네이티브 코드에서 카메라 피드 디코딩
- 정리
- 자바와 네이티브 스레드 동기화
- 5 완전한 네이티브 애플리케이션 작성
- 네이티브 액티비티 작성
- 실습 예제 | 기본적인 네이티브 액티비티 생성
- 액티비티 이벤트 처리
- 실습 예제 | 액티비티 이벤트 처리
- 네이티브 앱 glue
- UI 스레드
- 네이티브 스레드
- Android_app 구조체
- 네이티브에서 윈도우와 시간에 접근
- 실습 예제 | 그래픽 디스플레이와 타이머 구현
- 시간 기본형
- 정리
- 네이티브 액티비티 작성
- 6 OpenGL ES로 그래픽 렌더링
- OpenGL ES 초기화
- 실습 예제 | OpenGL ES 초기화
- 애셋 관리자로 PNG 텍스쳐 읽기
- 실습 예제 | OpenGL ES에서 텍스쳐 로딩
- 스프라이트 그리기
- 실습 예제 | 우주선 스프라이트 그리기
- 버텍스 버퍼 객체를 이용해 타일 맵 렌더링
- 실습 예제 | 타일 기반의 배경 화면 그리기
- 정리
- OpenGL ES 초기화
- 7 OpenSL ES로 사운드 재생
- OpenSL ES 초기화
- 실습 예제 | OpenSL ES 엔진과 출력 생성
- OpenSL ES 철학
- 음악 파일 재생
- 실습 예제 | 배경 음악 재생
- 사운드 재생
- 실습 예제 | 사운드 버퍼 큐 생성과 재생
- 이벤트 콜백
- 사운드 녹화
- 정리
- OpenSL ES 초기화
- 8 입력 기기와 센서 처리
- 안드로이드와의 상호작용
- 실습 예제 | 터치 이벤트 처리
- 키보드와 D패드, 트랙볼 이벤트 탐지
- 실습 예제 | 네이티브에서 키보드와 D패드, 트랙볼 처리
- 기기 센서 검증
- 실습 예제 | 기기를 조이패드로 변경
- 정리
- 안드로이드와의 상호작용
- 9 안드로이드에 기존 라이브러리 포팅
- 표준 템플릿 라이브러리를 이용한 개발
- 실습 예제 | DroidBlaster에 GNU STL 추가
- 정적과 공유
- STL 성능
- 안드로이드에서 부스트 컴파일
- 실습 예제 | DroidBlaster에 부스트 포함
- 안드로이드에 서드파티 라이브러리 포팅
- 실습 예제 | NDK를 이용해 Box2D와 Irrlicht 컴파일
- GCC 최적화 레벨
- Makefile 마스터
- Makefile 변수
- Makefile 명령
- 정리
- 표준 템플릿 라이브러리를 이용한 개발
- 10 전문 게임 개발
- Box2D를 이용한 물리 시뮬레이션
- 실습 예제 | Box2D를 이용한 물리 시뮬레이션
- 충돌 탐지
- 충돌 모드
- 충돌 필터링
- Box2D 자원
- 안드로이드에서 3D 엔진 구동
- 실습 예제 | Irrlicht를 이용한 3D 그래픽 렌더링
- Irrlicht 장면 관리
- 정리
- Box2D를 이용한 물리 시뮬레이션
- 11 디버깅과 문제 해결
- GDB를 이용한 디버깅
- 실습 예제 | DroidBlaster 디버깅
- 스택 트레이스 분석
- 실습 예제 | 크래시 덤프 분석
- 크래시 덤프
- 성능 분석
- 실습 예제 | Gprof 실행
- 동작 과정
- ARM과 thumb, 네온
- 정리
- GDB를 이용한 디버깅
도서 오류 신고
정오표
정오표
p123 4행
pEnv -> DeleteGlobalRef(lReference); → pEnv -> DeleteLocalRef(lReference);
p130 17행
C++ 코드는 좀 더 자연스럽고 단순하다.
p165 6행 코드 수정
public class StoreActivity extends Activity { → public class StoreActivity extends Activity implements StoreListener {
p204 2번 1행
ActvityHander.hpp → ActivityHandler.hpp
p255 6행 아래로 추가
const char* Resource::getPath() {
return mPath;
}
p218 5행
android_native_app_glue는 삶을 지운다. → android_native_app_glue는 간편하다.
glue 코드가 호출되면 UI 스레드를 해제해 → glue 코드가 호출되면 UI 스레드의 부담을 덜어주어
p262 코드 수정
void GraphicsTexture::callbackread(pngstructp pStruct,
pngbytep pData, pngsizet pSize) {
Resource* lResource = ((Resource*) pnggetioptr(pStruct));
if (lResource->read(pData, pSize) != STATUSOK) {
lResource->close();
pngerror(pStruct, "Error while reading PNG file");
}
}
p420 4번 1행
boot → boost