- 01.50분 JNI를 이용한 자바와 C 인터페이스 part1
JNI 인터페이스를 사용해서 자바 코드와 네이티브 C 코드 사이에 자료를 주고 받기
책갈피 : [00:15] 빈 프로젝트 생성/[00:22] MainActivity.java 코드 열기/[00:40] 네이티브 메소드 선언/[01:07] 네이티브 라이브러리 호출/[01:49] 네이티브 메소드 호출/[02:07] setTitle/[02:21] getMyData/[02:45] java 코드 완성/[03:07] 폴더 생성/[03:22] new-folder/[03:46] 폴더 안에 필수 파일 생성/[04:09] help-install new software/[04:15] Luna 선택/[04:39] programming languages/[05:15] 파일 생성/[06:00] local_module/[06:23] local_src_files/[07:29] 해당파일 추가 생성/[07:53] 헤더파일 입력/[08:13] 네이티브 메소드 함수 선언/[10:00] package 값 알기/[10:35] 메소드 이름 정확하게 입력/[11:30] 네이티브 코드 작성 완료/[11:43] ndk 컴파일/[12:13] 디렉토리 이동/[12:22] ndk-build/[13:07] ndk build 완료/[13:18] 어플리케이션 에뮬레이터로 실행/[13:39] 제목-네이티브 코드 동일/[14:09] 정보를 주고 받는 어플리케이션/[14:18] 새 프로젝트 생성/[14:28] 프로젝트 이름 생성/[14:56] 프로젝트 추가 확인/[15:11] MainActivity.java 코드 열기/[15:43] activity_main.xml 파일 수정/[16:18] 세부 정보는 코드를 통해 변경/[16:29] 구성/[16:40] 텍스트 입력/[17:03] 버튼 추가/[17:18] 구성 완료/[18:11] 세부 정보 확인 및 변경/[18:33] text 값 변경/[19:07] 속성 값 변경 완료/[19:15] 크기 및 위치 수정/[19:37] 저장 후 에뮬레이터 확인/[20:18] 정보를 주고 받는 기능 코드 입력/[21:32] 변수 선언/[22:18] editText/[22:26] spinner/[22:33] button/[23:21] 객체에 대한 정보를 import/[24:52] findViewById/[25:40] 더블클릭으로 id값 확인/[25:59] 두개의 값 서로 일치/[26:15] 키 값 복사 붙여넣기/[27:10] spinner와 button 정보도 id 변수 일치/[27:29] 네이티브 메소드 선언/[27:51] 총 4가지의 메소드 선언/[28:21] int/string/void 선언/[30:02] 네이티브 라이브러리 호출/[30:37] 안드로이드 파일 생성/[31:22] 빌드 환경설정 파일 생성/[31:33] module/files 이름 입력/[32:06] 패키지 이름 복사 붙여넣기/[32:30] 빌드 설정파일 완성/[32:37] 실제 네이티브 파일 소스 생성/[33:21] 4가지 메소드 복사 붙여넣기/[33:37] 내용 수정/[34:22] 네이티브 메소드 수정/[34:43] 패키지 이름과 클래스 이름을 추가적으로 입력/[35:49] 네이티브 메소드 기본 템플릿 완성/[36:15] 메소드 동작 추가/[36:45] 코드 입력/[37:37] findEntry 함수 선언/[37:52] GetStringUTFChars 함수/[38:35] 변수에 저장/[40:07] getInteger 메소드/[40:59] 코드 추가/[41:44] NewStringUTF/[42:15] ndk-build/[42:45] 네이티브 라이브러리 생성 확인/[43:05] 네이티브 메소드 호출/[43:34] 버튼을 눌렀을 때 동작 코드 추가/[43:52] 변수 설정/[44:22] OnClickListener 함수/[44:45] view에 해당하는 import/[45:05] onGetvalue/onSetvalue/[45:30] spinner 동작 추가/[46:22] lAdapter 변수/[47:15] 열거형 변수 integer/string/[47:37] ArrayAdapter import/[47:45] 에뮬레이터 확인/[48:20] 실제 동작
- 02.51분 JNI를 이용한 자바와 C 인터페이스 part2
JNI 인터페이스를 사용해서 자바 코드와 네이티브 C 코드 사이에 객체 및 배열 형식의 자료를 주고 받으며 오류를 처리
책갈피 : [00:09] 객체 정보 교환 방법/[00:19] 첫번째 예제 import/[00:31] copy projects into workspace 체크/[00:52] 해당 프로젝트 소스 수정/[01:21] StoreType.java 소스/[01:41] Store.java 소스/[02:36] 총 4개의 네이티브 메소드 선언/[02:42] StoreActivity.java 소스/[03:46] 잘못 입력할 때 경고메시지를 띄우는 기능/[03:53] 네이티브 c코드/[04:00] com_packtpub_Store.c/[04:30] 4개의 메소드에 대한 세부 동작/[04:54] Store.c/[05:30] 4개의 공용 함수-메소드에서 동일한 기능/[05:41] 안드로이드 어플리케이션/[05:46] main.xml 파일 열기/[06:30] 정보를 교환 할 수 있도록 변경/[06:44] StoreType.java 코드 열기/[06:58] color 추가/[07:15] 네이티브 메소드 추가/[07:46] 수정한 2개의 소스 저장/[08:11] class 선택/[08:22] 이름 입력 후 완료/[08:41] color 객체 선언/[09:31] StoreActivity.java 코드를 통해 정보 교환하는 부분 추가/[09:41] onGetValue 메소드 추가/[10:31] setColor 메소드 호출/[11:05] 에러 메시지 구문 추가/[11:31] color 정보를 교환하는 메소드 추가/[12:03] findEntry/[12:39] setColor 네이티브 메소드 선언/[12:48] NewGlobalRef/DeleteGlobalRef/[13:31] jobject/[16:07] color 정보 저장의 오류가 발생 했을 때/[16:44] Store.h 파일 열기/[17:03] color 정보 추가/[17:37] StoreValue/[17:56] StoreType/[18:26] store_max_capacity/[19:00] color object에 대한 구문 추구/[19:33] color 정보에 대한 접근 가능/[19:40] NULL 값 오류/[19:48] 헤더파일 추가/[20:00] 오류 해결/[20:41] ndk-build/[21:10] 에뮬레이터 확인/[23:41] 어플리케이션 오류/[23:52] 두번째 예제 열기/[25:17] 예외처리 부분 추가/[25:51] package 추가/[26:14] 해당 package에 대한 class 추가/[26:26] 해당 클래스 선언/[26:56] 오류 상황을 처리하기 위한 클래스/[27:21] 다른 예외 상황에 대한 클래스 추가/[27:52] 또 다른 예외 상황 클래스 추가/[28:41] 오류 상황 발생 설정/[28:51] Store.java 파일 열기/[29:06] 예외 상황 추가/[30:10] 다른 메소드에도 추가/[30:18] import/[30:45] StoreActivity.java 예외구문 추가/[31:03] onGetValue/[31:40] try catch문 추가/[32:07] import/[32:22] 저장 용량이 꽉 찼을 때의 예외처리/[32:34] onSetValu-try catch문에 catch부분 추가/[32:45] import/[32:58] 네이티브 c코드에서 오류가 발생했을 때 함수 추가/[34:00] Store.c 에서 오류 함수 추가/[34:37] 3가지의 함수 추가/[35:07] lclass/[37:07] 해당 예외의 함수를 실행/[37:19] 저장/[37:30] 만들어 놓은 함수 해당 헤더파일에 추가/[37:45] ndk-build/[38:35] 에뮬레이터 실행 확인/[41:29] 배열로된 데이터 주고받기/[41:58] libs 폴더에 guava 복사/[42:07] refresh-라이브러리 자동 생성/[42:30] StoreType.java에 array 추가/[42:43] integerArray/colorArray/[42:58] 네이티브 메소드 추가/[43:42] StoreActivity.java 메소드 추가/[44:58] stringToList 함수/[46:13] import/[46:22] 배열에 관련된 import 작업으로 오류 해결/[46:49] 네이티브 c코드 수정/[47:21] 정수열 배열로 저장할 수 있는 메소드 추가/[48:04] 배열 변수 추가/[48:37] 해당 헤더파일에 선언/[48:52] allocateEntry/[49:30] 배열에 대한 메모리를 정리하는 부분 추가/[49:45] 오류 해결 후 ndk-build/[49:51] 에뮬레이터 실행 확인
- 03.51분 네이티브 코드에서 자바 콜백 호출
JNI 인터페이스를 사용해서 네이티브 코드에서 자바 코드의 매소드 호출
책갈피 : [00:09] 자바와 네이티브 thread 동기화/[00:59] Store.java 코드 열기/[01:17] 메소드 추가/[01:49] 각 메소드에 synchronized추가/[02:12] 저장 후 StoreActivity.java 열기/[02:49] onStart/onStop/[03:30] setInteger/[04:27] 네이티브 코드 수정/[04:39] 파일 추가/[04:57] 헤더파일 내용 추가/[05:27] 3개의 상수 define/[05:46] OK/KO 정리/[06:41] 변수 선언/[07:00] startWatcher/stopWatcher 선언/[07:15] 파일 추가/[08:03] 메소드 기능/[08:50] 네이티브 메소드 동작 추가/[09:22] 메모리 용량 확보/[10:54] 네이티브 thread 종료 메소드 구현/[11:54] MonitorEnter/[12:56] deleteGlobalRef/[13:43] 코드 추가/[14:13] 정보를 가져오는 메소드/[15:03] runWatcher 메소드/[15:30] lStore/[15:58] 초기화 작업 완료/[16:37] STATE_OK/STATE_KO/[17:26] 일정한 시간만큼 sleep/[17:48] Entry라는 포인터에 지정/[18:59] processEntry 메소드 구현/[19:41] watcherCounter/[20:37] c코드 열기/[21:00] 네이티브 메소드를 생성하고 삭제하는 기능 추가/[21:15] initializeStore 메소드 추가/[21:29] finalizeStore 메소드 추가/[22:10] 구조체 변수 선언/[22:32] 헤더 파일 추가/[22:48] ndk 빌드작업 수행/[23:07] ndk 관련 라이브러리 생성/[23:18] 에뮬레이터 실행/[23:40] key값 입력/[24:11] 값이 증가 되는것 확인/[24:18] 네이티브 코드에서 자바 콜백 호출/[25:21] 인터페이스 추가/[25:47] 이름 입력 후 생성/[25:59] 오버로딩 메소드 선언/[26:25] Store.java 열기/[26:37] 인터페이스 상속/[27:00] Handler/StoreListener 변수 선언/[27:51] 메소드 구현/[28:45] Handler 정보 import 하고 저장/[29:55] Listener 인터페이스 상속 후 구현/[30:22] 경고 메시지 화면에 표시/[30:48] 저장/[31:00] 오류발생 해결/[31:44] 네이티브 코드 수정/[32:00] runWatcher/[32:43] 자바 콜백을 요청하는 메소드 추가/[33:22] class 추가/[34:07] class color 메소드 추가/[35:12] 콜백하고자 하는 메소드의 id값을 선언/[35:37] color object 변수 추가 후 저장/[35:52] 콜백 구현하는 동작/[36:06] 메소드 추가/[36:42] 네이티브 thread 초기화/[37:52] class 정보 연동/[38:22] 콜백하는 메소드 정보 연동/[39:21] GetMethodID/[40:30] void/[41:19] I/L/[41:45] 반환 값/[42:37] 각각의 자료형에 맞는 대표 심볼/[42:52] equal/[43:29] init/[44:07] color 설정/[44:30] 문자열 변환 메소드 사용/[45:19] 선언한 메소드 실제 구현 코드 추가/[45:22] processEntryInt/[46:00] 범위 안에 있는 콜백 메소드 호출/[47:37] 자바 코드에서 메소드 호출/[48:21] processEntryString/processEntryColor/[49:14] processEntry 수정/[49:35] 3개의 메소드로 호출 하도록 수정/[49:42] makeGlobalRef/[50:07] ndk-build/[50:15] 에뮬레이터 실행 후 key값 입력/[51:15] 콜백/콜백 중단 확인
- 04.50분 완전한 네이티브 어플리케이션 작성
자바 코드 없이 순수 네이티브 C/C++ 코드만을 사용해서 기본적인 이벤트를 처리하는 안드로이드 어플리케이션 제작
책갈피 : [00:12] c네이티브 코드만을 사용해 어플리케이션 생성/[00:17] 새 프로젝트 생성/[01:00] 레이아웃 폴더에있는 xml파일 삭제/[01:11] 자바코드 삭제/[01:37] AndroidManifest.xml파일 수정/[01:45] application 선택/[01:55] MainActivity 수정/[02:21] Meta Data 추가/[02:30] Meta Data값 수정/[03:27] Convert/[03:36] 변경/[04:15] 프로젝트 자동 빌드 환경 생성/[04:40] 빌드 환경 변경/[05:15] Apply 현재설정 수정/[05:30] 네이티브 코드 추가/[05:46] Header File 추가/[06:46] 프로젝트 설정 변경/[07:00] paths and symbols/[07:24] 헤더파일 경로 추가/[09:33] Assembly 언어 경로 추가 완료/[09:43] C/C++ 똑같은 경로 추가/[10:39] 두번째 Header File 추가/[11:07] namespace/[11:58] class 동작구현/[12:13] Source File/[12:35] log class의 info 구현/[14:16] error/warn/debug 구현/[15:07] Header File 추가/[15:35] EventLoop/[16:30] 헤더파일 2개 추가/[16:56] 자동빌드 후 오류 메시지 제거/[17:18] 동일한 이름의 c++ 파일 추가/[17:48] EventLoop 구현/[18:33] log출력함수를 이용한 메시지 출력/[18:56] ALooper_pollOnce/[19:37] 어플리케이션 종료/[20:48] 메인코드 c++파일 생성/[21:30] android_main/[21:55] 어플리케이션을 수행하는 동작/[22:37] 빌드 설정 파일 생성/[22:55] 설정 파일 추가/[23:29] module 이름으로 라이브러리 생성/[23:41] 저장 후 빌드 수행/[24:22] 라이브러리 파일 생성된것 확인/[24:37] 에뮬레이터 실행/[25:11] 어플리케이션 동작 log메시지로 확인/[25:26] LogCat/[26:07] saved filters 필터 추가/[27:33] 뒤로가기 버튼-앱 종료/[28:15] 네이티브 어플리케이션의 기능 확장/[28:30] types.hpp 열어 상수 선언/[28:41] status/[29:22] ActivityHandler class추가/[29:37] 메소드 선언/[30:26] EventLoop 코드 추가/[30:52] 콜백함수 선언/[31:11] 새로운 변수 선언/[31:45] 추가한 변수들 초기화/[32:35] userData/onAppCmd/[33:07] callback 함수 선언/[34:20] processAppEvent/[35:13] Handler에서 만든 메소드 추가 호출/[35:49] 추가적으로 코드 삽입/[35:52] 새로운 헤더파일 생성/[36:43] ActivityHandler메소드를 오버로딩/[37:04] 동일한 이름의 c++코드 생성/[37:42] 각각의 상태에 해당 메시지 출력/[38:15] 이벤트 처리 확장/[38:30] run/[39:43] 함수 수정/[40:13] 입력값 변경/[40:44] mEnabled/[42:22] 함수 추가/[42:30] activate/deactivate 메소드 선언/[44:15] 메시지 log로 출력/[46:29] 수정 후 완성/[46:37] ActivityHandler/[46:52] Blaster class 사용/[47:29] 오류 수정/[47:52] 저장 후 라이브러리 생성 확인/[48:00] 에뮬레이터 실행/[48:20] log 메시지 확인
- 05.42분 OpenGL ES로 그래픽 랜더링 part1
OpenGL ES 그래픽 라이브러리를 사용해서 안드로이드 어플리케이션을 제작
책갈피 : [00:11] 타이머를 통해 물체를 이동시키는 어플리케이션/[00:23] 새로운 header file생성/[00:52] class 선언/[01:23] 4개의 메소드/[01:38] 동일한 이름의 c++파일 생성/[02:04] 2개의 메소드 값 0으로 초기화/[03:28] 메소드 구현 후 저장/[04:00] header file 추가/[04:15] context 해당 내용 삽입/[04:55] blaster.hpp 파일 열기/[05:00] 2개의 class에 대한 header file을 include/[05:30] 변수 추가/[05:59] 도형을 움직일 수 있는 메소드 추가/[06:26] 도형을 그리는거와 관련된 변수나 객체 선언/[07:11] 수정한 class에 맞게 메소드 구현/[07:30] 생성자의 입력값 수정/[08:22] TimeService-reset/[09:31] WindowBuffer 구조체/[09:46] lock/unlock/[10:00] 도형의 위치 결정/[10:48] onStep메소드 구현/[11:15] 내용 추가/[11:35] x좌표 위치 수정/[12:03] 도형을 그리는 기능/[13:01] clear메소드 구현/[13:24] drawCursor메소드/[15:03] 해당 파일 수정 완료/[15:22] main 수정/[16:00] context변수/[16:15] 오류 처리/[17:07] LS_CPP변수 선언/[17:18] 컴파일 할 소스이름 자동화/[17:47] 저장 후 컴파일 확인/[18:00] 어플리케이션 에뮬레이터로 실행/[18:22] OpenGL ES로 그래픽 랜더링/[18:44] header file 생성/[18:59] GraphicsService class 선언/[19:22] getHeight/getWidth/[19:56] graphic에 관련된 source 추가/[20:30] class 실제 구현/[21:03] return값 바로 반환/[21:51] eglGetDisply/eglInitialize/[23:41] MakeCurrent/[24:32] OpenGL을 사용하기 위해 초기화 하는 start 메소드/[24:51] stop 메소드/[25:21] update 메소드/[25:40] ClearColor/Clear/[27:11] SwapBuffer/[27:22] GraphicsService 구현 완료/[27:32] 컴파일 에러 해결/[28:00] debug 메시지 수정을 위해 Log.hpp 파일 열기/[28:37] paths and symbols/[29:11] 오류 전부 해결/[29:18] Context.hpp열어 참조변수 추가/[29:56] Blaster 코드 수정/[30:15] 생성자 및 소멸자 수정/[30:47] clear/drawCursor 제거/[31:21] 수정된 Blaster class 구현/[31:30] Blaster.cpp 열어 수정된 것 반영/[31:47] 변수 모두 제거/[32:15] 어플리케이션 활성화 시 동작 수정/[32:58] TimeService-reset/[33:22] GraphicsService-stop 호출/[33:45] 기존 코드 삭제하고 update 메소드 호출/[34:27] Main.cpp 수정/[34:37] GraphicsService class 선언/[35:05] 입력 값 수정/[35:37] 빌드 설정 추가/[35:52] 저장/[36:07] 에뮬레이터 실행/[36:34] OpenGL ES로 텍스쳐 로딩/[36:44] png 그림파일 불러오기/[37:06] 라이브러리 다운받을 경로/[37:43] android-ndk폴더에 다운로드 받은 라이브러리 복사 후 압축 풀기/[38:00] scripts/[38:37] 해당 파일을 메모장으로 열어 스크립트 추가/[39:58] libpng/[40:30] paths and symbols-png 경로 추가/[41:30] obj-libpng.a라이브러리 생성 확인
- 06.50분 OpenGL ES로 그래픽 랜더링 part2
OpenGL ES 그래픽 라이브러리를 사용해서 텍스쳐 및 스프라이트를 표현하기
책갈피 : [00:08] OpenGS ES로 텍스쳐 로딩 실습/[00:23] assets 폴더/[00:50] assets 폴더에 그림파일 넣기/[01:33] header file 추가/[01:49] Resource class 선언/[02:50] source file 생성/[03:15] 생성자는 class에서 사용하는 3개의 변수 초기화/[03:37] open 메소드/[04:00] close/read/[04:46] header file 추가/[05:45] 텍스쳐를 사용하는데 관련된 class 만들기/[06:40] 변수 사용/[07:00] 텍스쳐 관련 class 구현/[07:12] source file 생성/[07:30] 3개의 메소드 구현/[07:46] getPath/getHeight/getWidth/[08:11] loadImage 구현/[08:24] 변수 사용/[09:13] signature 확인/[10:01] png_create_read_struct/[10:31] 콜백함수 등록/[11:16] png파일의 헤더를 읽는 부분을 구현/[11:58] 각각의 정보를 만들어둔 변수에 저장/[12:18] 투명도를 나타내는 변수 true 지정/[12:46] 색상 포맷의 변수/[13:24] png_read_update_info/[13:52] y좌표 변환/[14:11] rowsize/[16:07] 저장/[16:26] png_read_image/[16:45] ImageBuffer 반환/[17:15] callback을 호출하기 위한 함수 구현/[18:26] load 메소드 구현/[18:56] glGenTextures/[20:07] ImageBuffer 초기화/[20:30] unload/apply 메소드 구현/[21:29] GraphicsService.hpp 열기/[21:47] GraphicsService class에 소멸자 추가/[22:22] class 수정 후 실제로 구현/[22:29] GraphicsService.cpp 열기/[22:51] 추가로 만든 소멸자 구현/[23:18] loadResources/[24:07] 필요한 textures 수 만큼 load/[24:30] unloadResources/[24:48] mTextures/[26:18] 등록 되었는지 확인/[26:22] Blaster.cpp-onActivate/[27:22] loadImage 메소드 실행/[27:37] 에뮬레이터 실행/[28:11] LogCat 확인/[28:33] OpenGL ES로 스프라이트 표현/[29:40] Types.hpp 열고 구조체 추가/[30:06] 스프라이트 좌표값 변경/[30:26] header file 생성/[31:06] GraphicsSprite/[31:47] 변수 사용/[32:58] class 구현/[33:15] header file 추가/[33:28] 변수 초기화/[33:34] load 메소드 구현/[34:30] setAnimation 메소드 설정/[36:00] animationEnded 메소드/[36:30] draw 메소드/[36:45] 시간 값 입력/[38:19] 현재프레임의 x,y 위치/[38:44] 해당 x,y 인덱스 값 구하기/[39:22] Crop/[40:52] 저장/[41:15] 오류 발생 해결/[41:30] GraphicsService class 추가/[41:44] registerSprite 메소드 추가/[42:07] 스프라이트 관련 변수 추가/[42:14] GraphicsService.cpp 열기/[42:20] 스프라이트 관련 변수 초기화/[42:45] setup 메소드 호출/[43:37] draw 메소드 호출/[44:15] loadResources 수정/[45:00] 여러개의 스프라이트를 하나의 배열로 관리/[45:12] setup 메소드 구현/[45:45] 우주선 만들기/[45:59] 새로운 header file 생성/[46:07] 같은 이름의 source file 생성/[46:37] 변수 사용/[46:57] class 구현/[47:36] spawn 메소드/[48:14] Blaster.cpp 열기/[48:50] onActivate 메소드/[49:12] 오류 해결/[49:30] 저장 후 빌드/[49:38] 에뮬레이터 실행 후 애니메이션 확인
- 07.46분 OpenGL ES로 그래픽 랜더링 part3
OpenGL ES 그래픽 라이브러리를 사용해서 타일맵 랜더링 작업 수행하기
책갈피 : [00:08] 타일맵 랜더링/[00:23] 스크롤 하기 위해 타일맵 사용/[00:39] Tiled Map Editor/[01:19] tilemap 이미지 파일 열기/[01:33] tilemap.tmx 열기/[01:53] rapid xml 다운로드/[03:00] paths and symbols 헤더파일 추가/[03:14] 파일 경로 지정/[03:52] 오류 해결/[04:08] xml 파일 읽는 기능 추가/[04:14] Resource.hpp 열기/[04:25] 메소드 추가/[04:39] Resource.cpp 해당 메소드 구현/[05:00] tilemap 정보 가져오기/[05:15] 새로운 header file 생성/[05:45] 타일맵 class 선언/[06:10] load/unload/draw 메소드 사용/[06:30] 타일맵을 로드할 때 필요한 메소드/[07:15] 변수 사용/[08:20] GraphicsTileMap class 실제 구현/[08:28] header file과 동일한 이름의 source file 생성/[09:07] parse_error_handler 선언/[09:31] loadFile 메소드 구현/[10:30] xmlDocument 인스턴스 사용/[10:46] 태그 값/[11:50] 그림 확인/[12:35] gid/[13:45] 타일맵 정보를 실제 타일맵 class에 사용하는 데이터 변수에 입력/[13:56] 타일 정보를 xml 파일을 통해 저장/[14:46] 정보를 해당하는 변수에 저장/[15:20] TileCount/[15:43] Tiles/[16:18] gid value값 저장/[17:25] 전부 저장 후 사용한 변수 삭제/[17:45] loadVertices/[18:02] VertexCount/[19:03] Texel/[20:37] vertex 정보를 VertexBuffer에 저장/[22:15] buffer에서 offset 정보를 계산/[23:29] 필요한 vertex 좌표값 저장/[25:06] 해당 파일의 정보를 VertexBuffer에 저장/[25:44] 각각의 꼭지점에 해당하는 정보를 저장/[26:22] IndexBuffer를 만드는 메소드 구현/[27:22] loadIndexes 메소드 구현/[27:30] 변수 계산/[28:11] 6개의 index를 buffer에 저장/[29:07] load 메소드 구현/[30:17] Bind/[30:55] load 메소드 완성/[31:40] 그림을 잘라 타일로 붙여넣기/[31:48] 맵을 화면에 위치시키는 코드 작성/[32:22] DrawElements/[32:37] 랜더링하는 메소드까지 구현 완성/[33:04] GraphicsService.hpp 열기/[33:15] registerTileMap 메소드 선언/[33:22] tilemap 추가/[33:52] 추가로 사용했던 데이터를 생성자에서 초기화/[34:28] load/unload/resources 부분에 해당 타일맵 추가/[34:52] update 메소드 수정/[35:30] setup 메소드에 코드를 추가해 카메라 위치와 방향 설정/[35:52] header file 오류 해결/[36:20] header file 추가/[36:37] background-spawn/update 메소드 사용/[37:52] Blaster코드에서 background class 생성/[38:20] update 메소드 추가/[38:49] 저장 후 ndk 빌드 오류 없이 완료/[38:57] 에뮬레이터 확인/[39:22] 음악이나 효과음을 재생하는 어플리케이션 생성/[39:30] OpenSL ES 초기화 방법/[39:52] soundservice class 생성/[40:30] start/stop 메소드/[40:59] 오브젝트와 인터페이스/[41:37] output 인스턴스/[41:49] soundservice class 구현/[42:00] 생성자 초기화 한 후 start 메소드 구현/[42:07] 변수 사용/[42:07] CreateEngine/[43:00] Realize 메소드 호출/[43:37] stop 메소드/[44:00] Context-soundservice 추가/[44:15] Blaster 수정/[44:30] soundservice 추가/[45:07] Main 수정/[45:27] 오류 해결/[45:51] 빌드 에러 해결/[45:59] 라이브러리 사용 기본 작업 완료
- 08.42분 OpenSL ES로 사운드 재생
OpenSL ES 사운드 라이브러리를 사용해서 사운드를 재생 및 녹음 작업 수행하기
책갈피 : [00:18] 음악 재생 실습/[00:28] assets폴더에 mp3파일 붙여넣기/[00:58] 리소스 헤더파일 열기/[01:15] descriptor삽입/[01:44] 메소드 추가/[02:06] 리소스 코드 파일 열기/[02:14] descript메소드 구현/[02:29] aassetmanager_open/[03:00] 사운드서비스 헤더파일 열기/[03:15] 사운드서비스 클래스에 2개의 메소드 추가/[03:38] 배경음악과 관련된 인터페이스 선언/[04:00] 탐색에 관련된 인터페이스/[04:23] 사운드서비스 코드 열고 생성자 추가/[05:00] descript에서 음악파일 확인/[05:14] descript에서 확인된 정보를 재생에 관련된 데이터 변수에 넣기/[05:53] 오디오 설정/[06:00] datasource/datasink/[06:15] output은 스피커 관련 객체 넣어주기/[06:30] 오디오플레이어 생성/[06:57] 관련된 데이터 초기화/[07:46] 객체를 초기화하는 부분과 실체화하는 구현/[08:18] realize메소드/[08:28] 필요한 인터페이스 설정/[09:13] 재생 설정/[09:31] 시작부터 계속 반복하는 것으로 설정/[10:03] 음악을 멈추는 메소드 구현/[10:43] 헤더파일 추가/[10:52] 음악파일 관련 메소드/[11:24] blaster코드 파일/[11:50] 최종 빌드 후 에뮬레이터 동작 확인/[12:31] 짧은 효과음을 재생할 수 있는 실습/[13:16] 짧은 효과음은 사운드버퍼 사용/[13:50] 사운드버퍼는 pcm형식의 사운드 파일 사용/[14:24] 사운드 헤더파일 생성/[14:39] 사운드버퍼관련 클래스 생성/[15:05] load와 unload메소드/[15:26] 메소드 구현/[15:50] 사운드 클래스 생성자를 만들어 관련 변수를 초기화/[16:18] load메소드/[16:48] unload메소드/[17:06] 사운드버퍼 메소드를 사운드서비스 클래스에 추가/[17:15] 사운드서비스 헤더파일 열고 메소드 넣기/[17:52] playsound메소드 추가/[18:07] 사운드큐에 관련된 데이터 선언/[18:26] mplayer/[18:37] 효과음 데이터를 다루기위한 버퍼 선언/[18:52] 사운드서비스 코드 열고 생성자에 추가한 변수 초기화/[19:11] 사운드큐를 모두 제거하기 위한 소멸자 추가/[19:29] 헤더파일에도 소멸자 넣기/[20:00] startsoundplayer메소드 구현/[20:37] sldatalocator를 사용해 관련 정보 설정/[21:00] 사운드버퍼 개수 설정/[21:18] 입력채널과 출력채널 설정/[22:22] 플레어의 상태는 재생/[23:03] 사운드 서비스가 멈췄을 때의 동작 추가/[23:22] unload메소드 실행/[23:37] registersound메소드/[24:03] playsound메소드/[24:22] clear메소드/[24:30] enqueue/[24:55] 효과음 데이터를 로드하기 위한 코드 입력/[25:29] blaster헤더파일/[26:10] registersound를 사용해서 초기화/[26:56] 효과음을 재생하기 위해 playsound호출/[27:18] assets폴더에 효과음 넣기/[27:25] 빌드 후 에뮬레이터 실행/[27:41] 콜백함수를 추가해서 사운드가 종료되었을 때 특정 함수를 호출할 수 있는 실습/[28:06] 사운드서비스 헤더파일을 열고 콜백함수 선언/[29:18] registercallback/[30:00] setcallbackeventsmask/[30:25] 해당 콜백함수 구현/[30:48] 에뮬레이터 실행/[31:18] 사운드 녹음 실습/[31:47] 인증 추가-androidmanifest.xml/[32:15] 사운드서비스 헤더파일 열기/[32:28] recordsound/playrecordedsound메소드 추가/[33:19] 추가메소드와 데이터 초기화/[34:07] 녹음을 초기화 하는 메소드 호출/[34:45] 효과음과 유사하게 초기화/[35:37] 사운드 녹음을 위한 객체 생성 및 인터페이스 설정/[36:50] 사운드 녹음관련 콜백함수 등록/[37:27] 콜백함수를 실제로 구현하도록 소스 추가/[37:52] recordsound메소드 구현/[38:45] playrecordedsound만들기/[39:19] blaster코드 열기/[40:54] 에뮬레이터 로그메시지를 통해 확인
- 09.38분 입력 기기 처리
안드로이드 NDK를 사용해서 입력 기기에서 발생하는 이벤트 처리하기
책갈피 : [00:10] 입력장치 처리 실습/[00:45] 터치스크린을 통해 터치이벤트 처리 구현/[01:11] activityhandler와 유사/[01:56] 헤더파일 생성/[02:14] inputhandler클래스 선언/[02:53] input서비스 헤더파일과 c++파일 추가/[03:23] ontouchevent를 override해서 구현/[03:35] gethorizontal/getvertical메소드/[03:57] setrefpoint메소드/[04:30] eventloop헤더파일 열기/[05:08] processinputevent메소드 추가/[05:46] input핸들러를 사용하기 위해 자료 추가/[05:58] 동작 구현/[06:12] eventloop코드파일에서 생성자 수정/[06:41] 콜백함수 구현/[07:12] processinputevent메소드를 통해 터치 이벤트 처리/[08:13] 터치스크린을 통해 입력을 받았을 경우/[08:37] ontouchevent를 통해 터치이벤트 처리/[08:56] eventloop에서 계속 동작하는 run메소드 수정/[09:16] run메소드에 입력값 추가/[11:09] 이벤트 구현/[11:18] input서비스를 소스파일을 추가해서 터치이벤트 구현/[11:35] inputservice.c++파일 생성/[12:00] gethorizontal/getvertical/setrefpoint메소드 구현/[12:20] ontouchevent메소드 구현/[13:01] amotionevent_getx/amotionevent_gety/[15:31] 터치이벤트 메소드는 콜백함수를 통해 계속 호출/[16:44] 해당 서비스를 context에 등록/[16:56] class선언/[17:18] blaster코드 살펴보기/[18:00] inputservice를 초기화 하기위한 코드 삽입/[18:48] 우주선의 정보를 가지고 있는 헤더파일 열기/[19:07] update메소드 추가/[19:22] mtimeservice/minputservice추가/[20:37] update메소드 추가/[21:07] 메인 소스 수정/[22:15] context-inptservice추가/[22:45] 에뮬레이터 실행/[23:07] 에러 수정/[23:30] blaster소소에 update메소드 호출/[24:03] 에뮬레이터 실행/[24:40] 키보드,디패드,트랙볼 입력처리 실습/[24:52] 키보드/[25:17] 디패드/[25:26] 트랙볼/[25:48] 터치이벤트를 처리하는 메소드 아래 키보드와 트랙볼 메소드 추가/[26:22] processinputevent에 조건 추가/[27:30] 키보드,디패드,트랙볼을 처리하는 실제코드 구현/[27:36] input핸들러에서 상속받은 2개의 메소드 override/[27:56] mMenukey변수/[28:14] update매소드 추가/[28:59] 키보드 이벤트 메소드 구현/[29:52] 좌표 움직임 결정/[30:10] 키가 눌렸다 떼어질 때의 조건/[31:02] 트랙볼 이벤트 메소드 구현/[31:48] 좌표 움직임 결정/[33:37] blaster코드파일 열기/[34:22] 에뮬레이터 실행 확인/[34:45] 에뮬레이터에서 디패드 활성화 방법/[35:43] .android폴더-avd/[36:07] android_4.4.avd-config파일 열기/[36:21] 설정 정보 중 dPad를 yes로 변경/[36:36] 저장후 AVD매니저에 들어와 디테일 확인/[36:53] 에뮬레이터 실행
- 10.50분 센서 처리
안드로이드 NDK를 사용해서 센서에서 발생하는 이벤트를 처리하기
책갈피 : [00:06] 가상키보드 제어 방법 구현/[00:48] c++기반/[01:03] initialize메소드 구현/[01:26] 클래스 캐싱/[02:07] activity살펴보기/[02:36] makeglobalref메소드/[03:00] context/[03:21] view/window/inputmethodmanager/[03:36] 메소드 id에 대한 캐싱작업/[03:53] getsystemservice/[04:24] 실제 자바코드 보기/[04:46] getwindow/[05:00] windowtoken/[05:15] 가상키보드를 감추는 메소드/[05:46] 가상키보드를 보여주는 메소드/[06:15] 필드아이디 캐싱/[06:43] 필드 id값이 메소드getsystemservice에서 입력값으로 사용/[07:00] error처리/[07:46] 가상키보드를 표시하고 감추는 메소드 구현/[07:57] show메소드 구현/[08:24] input_method_service/[09:24] callobjectmethod/[10:03] showsoftinput/[10:48] getdecorview메소드를 실행한 결과 값/[11:15] window수행/[11:52] hide메소드 동일하게 구현/[12:09] lBinder변수/[12:31] 키보드 클래스를 입력서비스를 처리하는 input서비스에서 가져와 사용/[12:48] inputservice생성자에 키보드관련 클래스 추가/[13:03] mEkey/[13:30] 멤버변수 초기화/[14:01] update메소드 수정/[14:58] onkeyboardevent수정/[15:31] 메인코드 열기/[15:52] JNI와 keyboard클래스 생성/[16:07] 에뮬레이터 실행 확인/[16:48] 센서 제어 실습/[17:03] 가속도 센서/[18:11] inputhandler에 메소드 추가/[18:26] onaccelerometerevent추가/[18:45] 센서 처리 메소드 추가/[19:03] 센서관련 변수 추가/[19:22] friend지시자/[20:26] eventloop에서 추가했던 것들을 해당 소스에서 수정/[21:11] sensor queue를 등록하는 코드를 추가/[21:48] ASensorManager_getinstance메소드/[22:22] sensor queue를 제거하는 코드를 추가/[23:03] event type확인/[23:33] callback메소드 구현/[24:40] 센서 클래스 만들기/[25:15] toggle/enable/disable메소드/[26:02] eventloop클래스 선언/[26:30] sensor클래스를 friend지시자를 사용해서 선언/[27:22] 소스파일 구현/[27:33] toggle메소드 구현/[27:52] 활성화 메소드 구현/[29:11] 최소 delay값을 입력값으로 설정/[29:47] log메시지/[30:11] 비활성화 메소드 구현/[30:37] inputservice클래스 수정/[31:00] 가속도 센서 이벤트를 처리하기위한 메소드 추가/[31:26] 멤버변수 수정/[31:47] 소스코드 수정/[32:13] update메소드 수정/[33:15] stop메소드 추가/[33:45] onaccelerometer이벤트 구현/[36:27] blaster에서 사용하도록 수정/[36:49] 메인코드 열기/[37:15] 센서클래스를 사용하기 위한 초기화/[37:45] 에뮬레이터 실행 확인/[38:00] logcat메시지 확인/[38:45] 화면 회전 방향을 탐지할 수 있는 방법 구현/[39:15] 자바코드 확인/[40:05] 헤더파일과 소스파일 생성/[40:30] 클래스 생성/[40:49] 방향을 나타내는 상수를 생성/[41:35] 해당 클래스 실제 구현/[42:13] 로그메시지를 표시하기 위해 코드추가/[43:42] findrotation메소드 실행/[45:19] 가상키보드 처리방식과 동일하게 작업/[46:12] callobjectmethod사용/[47:36] getrotation/[47:51] inputservice에서 활용/[48:20] 화면 회전에 관련된 멤버변수 추가/[49:00] configuration추가/[50:04] 가속도 센서축을 전환
- 11.47분 기존 라이브러리 포팅 part1
안드로이드 NDK를 통해 기존의 C++ 관련 범용 라이브러리를 가져와서 적용하기
책갈피 : [00:07] c++ 라이브러리 포팅/[00:23] STL/[00:46] NDK에서 STL을 사용하는 방법/[01:15] STL포트 사용/[01:33] 새 파일 생성/[02:00] 예제 구현/[02:46] 리소스 헤더파일 열기/[03:06] fstream헤더파일 추가/[03:46] descript관련 코드 제거/[04:15] 리소스 코드 열기/[04:30] 생성자를 수정하고 바뀐 멤버변수 초기화/[04:59] open메소드 코드 수정/[06:12] close메소드 코드 수정/[06:45] read메소드 코드 수정/[07:15] fail메소드 추가적으로 호출/[07:46] getlength메소드/[08:09] stat함수 호출/[08:39] bufferize메소드/[10:33] 사운드서비스 수정/[10:48] playbgm메소드 수정/[11:35] path-문자열 변수/[11:58] uri 데이터 포맷/[12:56] 권한 설정/[13:20] sd카드를 사용할 수 있도록 권한 추가/[13:48] assets폴더에 있는 리소스를 sd카드 데이터영역에 넣기/[14:13] cmd창 띄우기/[14:33] 리소스파일들 에뮬레이터에 넣기/[15:09] 에뮬레이터가 표시되는지 확인/[15:50] adb push/[16:44] adb shell-해당 안드로이드 에뮬레이터로 접속/[17:07] blaster디렉토리 생성/[17:26] 해당 디렉토리에 파일 전송/[18:26] background파일 열기/[18:45] 경로 수정/[19:18] ship파일 열어 경로 수정/[19:32] blaster소스파일을 열어 start.pcm/bgm.mp3 경로 수정/[20:15] 에뮬레이터 실행/[20:44] 랜덤으로 돌진하는 장애물 구현/[21:00] 타입파일 열기/[21:17] 랜덤값에 최대값 넣기/[22:06] 시간서비스 파일 열기/[22:18] 랜덤함수값으로 초기화/[22:52] 2개의 파일 생성/[23:15] 헤더파일에서 클래스 생성/[24:14] 장애물 클래스 구현/[24:40] 이미지파일/[25:47] 2개의 메소드 구현/[25:55] spawn메소드/[26:48] update메소드/[27:45] stl라이브러리에서 제공하는 벡터 사용/[27:52] 블라스터 헤더파일 열기/[28:45] 멤버변수에 백터를 사용/[29:33] 블라스터 소스코드의 생성자 수정/[30:22] 소멸자 생성/[31:33] onactivate가 호출되었을 때 코드 입력/[31:48] iterator사용/[32:22] onstep메소드/[33:00] 에뮬레이터 동작 확인/[35:30] 부스트 라이브러리를 사용해 ndk에 적용/[35:52] 스마트 포인터/[36:30] 스마트 포인터 사용방법/[37:12] 안드로이드ndk 부스트 사용방법/[38:19] mk 빌드 설정 파일/[39:29] 빌드 설정 파일 수정/[40:15] module import/[40:43] 부스트를 사용하기 위한 예외처리 기능/[41:20] 그래픽타일맵 소스코드 수정/[41:49] try/catch문으로 변경/[42:22] 스마트 포인터 추가/[42:45] vector/iterator선언/[43:19] boost를 사용한 스마트 포인터/[44:15] 블라스터 헤더파일을 열어 벡터 헤더 제거/[44:45] iterator부분 수정/[45:58] 소멸자 삭제
- 12.45분 기존 라이브러리 포팅 part2
안드로이드 NDK를 통해 기존의 그래픽관련 라이브러리를 가져와서 적용하기
책갈피 : [00:06] 부스트 라이브러리 오류 수정/[01:22] 설정파일을 열어 헤더파일 경로 등록/[01:30] properties for jni/[01:45] paths and symbols-add/[02:07] 에러 메시지 사라진 것 확인/[02:49] 블라스터 헤더파일에 벡터 헤더파일 삭제/[03:22] iterator부분 변경/[03:35] 부스트 라이브러리를 이용해서 thread사용하는 방법/[04:15] updatethread메소드 추가/[04:30] 소스코드 구현/[05:14] lthread생성/[06:00] join메소드 호출/[06:14] 에러 처리/[07:00] 에뮬레이터 실행/[07:46] 별도의 thread사용 장점/[08:54] 기타 라이브러리를 ndk에서 사용하는 실습/[10:09] box2d 소스파일 다운받기/[10:56] 빌드 설정 파일 추가/[11:20] 파일 열고 빌드 설정 추가/[11:56] 컴파일할 box2d파일 나열/[12:22] ls_cpp변수/[13:24] box2d에 있는 모든 소스파일 선택/[14:31] box2d_cpp변수/[15:41] 빌드작업을 수행하기 위한 동작/[16:06] module이름 지정/[16:22] 컴파일 할 파일/[17:02] local_export_c_includes/[17:52] 정적 라이브러리로 만들어 컴파일 지정/[18:03] 정적 라이브러리와 공유 라이브러리 차이/[18:44] 확장자 유형이 mk파일인지 확인/[18:59] android.mk파일 열기/[19:30] box2d_static추가/[19:55] 저장하면 자동으로 컴파일 진행/[21:03] properties for jni/[21:15] 경로 설정/[21:45] irrlicht라이브러리 ndk로 가져오기/[22:25] android.mk파일 열어 android ndk에 맞게 수정/[23:18] android부분 소스파일 불필요한 부분 제거/[24:00] importgl/[24:52] irrlicht/[25:15] 컴파일 할 때 옵션을 제공하는 플래그 수정/[26:26] 3개의 경로 추가/[27:03] libpng안에 있는 모든 헤더파일 포함/[27:40] 로드라이브러리 변수 수정/[28:21] 정적 이브러리로 빌드되도록 수정/[28:47] 빌드 설정 파일 열기/[29:00] irrlicht추가/[29:18] 저장하면 자동으로 컴파일 진행/[29:33] 에러 출력/[30:03] 수정하기 위해 default-build-commands.mk파일 열기/[30:26] 수정 후 다시 컴파일/[31:07] properties for jni에서 경로 추가/[31:45] 물리 엔진을 사용해서 물리 효과 적용 실습/[32:00] 지금까지 만들었던 어플리케이션 실행/[32:29] 물리적 효과 삽입/[33:22] 기초적인 개념 설명/[34:34] box2d를 사용해 코드 추가/[34:52] physicsobject이름의 헤더파일과 소스파일 생성/[35:21] 필요한 헤더파일 추가/[35:52] physicsobject클래스 선언/[36:50] vector/[37:15] iterator제공/[37:37] 생성자 메소드 선언/[38:19] initialize/update메소드 사용/[38:30] 2개의 멤버변수/[39:30] 각각 메소드 구현/[39:45] 헤더파일 추가 후 생성자 구현/[41:30] body확인/[42:30] shape초기화/[43:21] 물리속성 초기화/[44:05] userdata/[44:28] createbody메소드/[44:45] createfixture메소드
- 13.41분 물리 시뮬레이션
안드로이드 NDK를 통해 Box2D 라이브러리를 사용해서 물리 시뮬레이션 수행하기
책갈피 : [00:08] createtarget메소드/[00:19] physicstarget클래스/[01:00] initialize메소드/[01:34] b2vec2/[02:15] scale_factor라는 상수값/[02:45] 타입 헤더파일 열어서 벡터 상수값 추가/[03:42] update메소드/[04:15] setposition/[05:15] 헤더파일 에러/[05:30] 빌드 환경 설정 파일 열어서 수정/[05:55] 헤더파일과 소스파일 생성/[06:23] physicstarget클래스 생성/[06:42] settarget메소드 사용/[07:00] b2mousejoint객체 선언/[08:39] 생성자와 settarget메소드 구현/[08:50] 생성자를 통해 필요한 정보 초기화/[09:24] joint를 위해 필요한 body선언/[10:09] mousejoint설정/[10:35] joint라는 물리효과를 내기위한 속성값/[11:05] settarget메소드 구현/[11:52] scale_factor를 통해 축소/[13:22] physicsservice헤더파일과 소스파일 생성/[14:18] physicsservice클래스 선언/[15:05] physicsservice에서 필요한 메소드/[15:13] registerentity메소드/[15:28] update메소드/[15:45] begincontact메소드/[16:07] physicsservice가 사용하는 멤버변수/[16:48] 2개의 상수 사용/[17:17] 각종 메소드 구현/[17:33] setcontactlistener/[18:00] registerentity메소드 구현/[18:14] physicsobject클래스 생성/[19:47] update메소드 구현/[20:06] collider/[21:45] simulation/[22:21] 결과 update/[23:45] begincontact메소드 구현/[25:02] context에 등록/[25:29] 장애물 움직이는 것 수정/[26:14] 물리효과 추가/[26:47] physicsobject클래스를 멤버변수로 추가/[27:11] physicsobject생성 후 초기화/[27:25] registerentity메소드 호출/[27:48] 입력받는 값/[28:45] spawn메소드 수정/[29:03] 최소 속도와 속도의 범위 지정/[29:48] initialize통해 장애물 표시/[30:32] update메소드 수정/[32:05] physicsobject에서 생성한 위치정보로 변경/[32:22] 우주선에 물리효과 추가/[32:49] physicstarget멤버변수 추가/[33:15] physicsobject생성 후 초기화/[33:30] registerentity메소드 호출/[34:52] 위치 변수값 수정/[35:22] createtarget메소드 호출/[35:43] joint물리효과 구성/[36:07] spawn메소드 수정/[36:37] update메소드 수정/[36:52] settarget메소드 호출/[37:45] 블라스터 코드 열기/[37:57] physicsservice추가/[38:29] onstep메소드/[39:04] 메인코드 열기/[39:21] physicsservice생성하고 context에 넣어주기/[39:35] 에뮬레이터 실행 동작 확인/[40:22] 우주선의 범주와 마스크값 변경/[40:44] 에뮬레이터 실행 동작 확인
- 14.41분 3D 그래픽 랜더링
안드로이드 NDK를 통해 Irrlicht 라이브러리를 사용해서 3D 그래픽 랜더링 수행하기
책갈피 : [00:09] 3d그래픽 랜더링 실습/[00:20] irrlicht라이브러리/[01:15] 헤더파일과 소스파일 생성/[01:48] class정의/[02:15] 생성자 선언/[02:49] spin메소드 사용/[02:59] initialize/update메소드/[03:15] initialize메소드의 입력값/[04:46] 멤버변수 확인/[05:15] 저장/[05:40] properties for jni-paths and symbols/[05:46] 헤더파일 경로 추가/[07:00] graphicsobject소스파일 생성/[07:28] spin메소드 구현/[08:07] scenenodeanimator객체 생성/[08:39] addanimator메소드로 추가/[09:11] initialize메소드/[09:24] getmesh/gettexture/[10:13] addmeshscenenode메소드 호출/[11:05] update메소드 구현/[12:20] graphicsservice클래스 수정/[13:13] graphicssprite/texture/tilemap 헤더파일 및 소스파일 삭제/[13:33] 헤더파일과 메소드, 멤버변수 삭제/[14:16] graphicsobject를 추가하기 위한 등록 메소드/[15:05] 3개의 멤버변수 추가/[15:13] irrlichtdevice/[15:48] videodriver/[16:00] scenemanager/[16:29] graphicsservice소스파일 열기/[16:41] 추가한 멤버변수 초기화/[17:06] start메소드 수정/[17:52] stop메소드 수정/[18:11] setup메소드 수정/[19:11] 엔진 초기화/[20:29] mdevice변수를 통해 초기화 작업 수행/[20:47] 폴더 경로 지정/[21:32] getvideodriver/getscenemanager메소드/[21:48] 장면에 대한 설정/[22:07] setambientlight메소드/[22:30] addlightscenenode/[23:03] 카메라 정보 설정/[23:30] settarget/setposition메소드/[23:45] 배경 만들기/[24:07] 파티클/[24:48] emitter설정/[26:44] gettexture메소드/[28:33] update메소드 수정/[29:48] drawall메소드 호출/[30:26] registerobject메소드 구현/[31:18] 컴파일 오류가 발생 할 경우/[32:04] 장애물과 우주선 객체에 변경된 사항 적용/[32:45] 장애물 소스파일 열기/[33:04] mesh정보 초기화/[33:52] spin메소드/[34:43] 우주선 동일하게 수정/[35:22] registerobject호출/[36:00] background 헤더파일과 소스파일 제거/[36:37] background부분 모두 삭제/[39:07] cmd화면 출력/[40:15] 에뮬레이터 실행/[41:07] 3d그래픽 표현과 애니메이션 구현 확인
- 15.45분 디버깅과 문제해결
안드로이드 NDK를 통해 디버깅 및 성능 분석 작업 수행하기
책갈피 : [00:07] 어플리케이션 디버깅과 문제해결 방법 실습/[01:00] cygwin설치/[03:36] cygwin terminal실행/[04:15] cygdrive디렉토리/[05:00] 실제 디렉토리의 파일과 하위 디렉토리 알아보기/[05:24] 실제 윈도우에 있는 디렉토리인지 확인/[05:53] 디버깅을 사용하기 위한 설정/[06:11] androidmanifest.xml파일 수정/[06:46] 경고 해결 방법/[07:41] 에뮬레이터 실행/[08:01] 디버깅을 위해 cygwin입력창/[08:43] ndk-gdb입력/[09:18] gdb가 실행되면 3개의 파일 생성/[09:48] gdb.setup파일/[09:56] app_process파일/[10:18] libc.so파일/[11:56] gdb디버깅/[13:13] acroedit 설치/[13:43] acroedit실행/[13:56] 복사한 gdb.setup파일 붙여넣기/[14:22] 개행 문자 형식을 unix형식으로 변경/[14:52] eclipse상단에 run-debug configurations선택/[15:09] 새로운 항목 추가/[16:25] project/[17:00] select other선택/[17:33] debugger의 경로 설정/[18:41] connection탭에서 type을 tcp로 변경/[19:26] ndk-gdb2-acroedit로 편집 선택/[21:03] nativeapp 디버깅 수행/[21:26] cygwin입력창에 ndk-gdb2실행/[22:10] blaster_jni디버깅 설정 선택/[22:37] 디버깅 멈추기/[23:02] 어플리케이션 특정부분에 break삽입/[23:26] toggle breakpoint/[23:48] nativeapp 디버깅 수행/[24:44] 디버깅 메뉴/[25:51] stepinto와 stepover의 차이/[27:00] 어플리케이션의 성능 분석 프로파일/[28:52] 프로파일러 압축파일 풀기/[29:45] prof헤더파일 빌드 설정 변경/[29:56] 빌드설정 acroedit편집기로 열기/[31:00] 프로파일러 모듈의 이름/[31:32] 기존 코드 수정/[31:51] 메인코드 열기/[32:22] 네이티브 라이브러리 설정/[33:19] 모니터링이 끝나는 함수 호출/[33:43] 경로 추가/[34:07] add-프로파일러가 설치된 경로/[34:50] 오류메시지 해결/[35:15] 빌드 설정파일 android로 변경/[35:43] 빌드 설정파일을 열고 프로파일러에 관련된 모듈 추가/[36:22] 프로파일링 결과 저장을 위해 sd카드 사용 변경/[36:35] androidmanifest.xml 열기/[37:07] 에뮬레이터 실행 후 로그메시지 확인/[38:34] 저장된 파일을 에뮬레이터에서 pc로 가져오기/[38:44] cmd창 열고 adb pull명령어 입력/[39:45] copy명령/[40:30] 해당하는 툴의 경로 입력/[40:45] arm-linux-androideabi-4.6선택/[41:22] 분석할 라이브러리 추가/[42:07] 텍스트 파일로 저장/[42:22] 저장된 결과 확인/[43:07] 메소드의 시간 소모 확인/[43:52] gprof는 간단한 결과를 보여주는 프로파일러
- 16.43분 멀티미디어 재생 part1
안드로이드 NDK를 통해 멀티미디어 데이터 처리하기
책갈피 : [00:09] 멀티미디어 재생 실습/[00:37] 오픈맥스/[00:57] 오픈맥스 dl/[01:07] 오픈맥스 al/[01:26] 오픈맥스 il/[02:21] 프로젝트 생성/[02:53] empty activity선택/[03:23] xml파일과 activity클래스 생성/[04:09] main.xml파일 열기/[04:38] graphical laout탭과 main.xml탭을 오가며 설정/[04:55] textview확인/[05:13] values-strings.xml파일 열기/[05:39] value값 변경/[05:46] 저장 후 graphical laout으로 확인/[06:46] spinner삽입/[07:26] id값과 textview1/[08:03] textview삽입/[08:16] strings.xml에서 해당 텍스트 추가/[09:28] main.xml에 문자열 변수 지정/[09:39] spinner추가/[10:09] button추가/[10:28] 버튼 이름 바꾸기/[11:35] 직접 문자열 입력과 문자열 변수를 사용해 입력/[12:50] advanced-surfaceview선택/[13:09] 크기 조정/[14:20] surfaceview추가/[14:46] 자바코드로 연동해서 구현/[15:11] oncreate메소드/[15:22] setcontentview메소드/[16:48] surfaceview1 설정/[17:22] surfaceview/surfaceholder변수 선언/[17:48] 자동으로 import/[18:11] findviewbyId메소드/[19:15] surfaceholer변수/[19:33] callback설정/[19:48] 변경된 사항을 처리할 수 있는 미리 만들어진 메소드 구현/[21:00] log출력/[21:17] tag변수 선언/[22:15] spinner ui객체 구현/[22:56] spinner변수 선언/[23:15] 해당 부분 import/[23:59] arrayadapter/[24:30] createfromresource메소드/[25:21] values-strings.xml파일 열기/[25:33] 문자열 array추가/[26:10] array에 아이템 추가/[26:47] 멀티미디어 데이터 경로 입력/[28:03] adapter와 spinner연동/[28:18] setonitemselectedlistener/[29:03] 2개의 메소드 구현/[29:37] msourcestring문자열 변수 추가/[30:52] 에뮬레이터 확인/[31:29] ui수정중에 ui가 깨지는 경우/[32:15] 두번째 spinner동일한 방식으로 구현/[33:07] string array추가/[33:22] 아이템 추가/[33:49] adapter활성화/[34:43] msurfaceview2추가/[35:45] videosink구현/[36:22] videosink클래스 생성/[36:37] setfixedsize/useassinkfornative메소드/[37:15] 버튼 구현/[37:35] setonclicklistener메소드/[38:07] 눌렀을 때 동작 추가/[38:37] 비디오싱크 설정/[39:22] 재생 할 멀티미디어 파일 경로/[40:37] 정지시키는 버튼/[40:52] finish메소드 호출/[41:13] 처음으로 돌아가는 버튼/[42:22] jni인터페이스를 통해 메소드를 구동할 수 있도록 선언/[42:35] loadlibrary메소드 호출
- 17.46분 멀티미디어 재생 part2
안드로이드 NDK를 통해 멀티미디어 데이터 처리하기
책갈피 : [00:00] 오픈맥스 라이브러리를 이용한 멀티미디어 재생/[00:19] 네이티브로 구현하기 위한 함수 선언/[00:43] 프로젝트에 폴더 생성/[00:58] c파일 생성/[01:27] 헤더파일 추가/[01:43] log메시지/[02:28] 오픈맥스에 관련된 헤더파일 추가/[02:42] 어플리케이션 화면 제어에 필요한 헤더파일 추가/[02:53] 전역변수 선언/[03:49] 멀티미디어 재생을 위한 인터페이스 선언/[04:17] 필요한 상수 정리/[04:47] nativewindow 변수 선언/[05:01] datacache 배열로 저장되도록 선언/[05:27] file포인터 선언/[06:06] reachedeof 변수 사용/[06:31] 매직넘버/[07:04] mutex 선언/[07:44] discontinuity 변수 사용/[08:11] enqueueinitialbuffers 함수/[09:00] callback 함수 구현/[09:36] androidbufferqueuecallback/[09:55] 8개의 입력변수의 입력 값/[10:41] res 변수 선언/[10:52] lock을 거는 변수/[12:23] rewind 함수 호출/[13:39] discontinuity가 거짓일 경우 처리 구현/[14:02] log메시지/[14:37] 버퍼에 있는 정보를 읽고 처리하는 코드 추가/[15:14] fread 호출/[17:03] packetsread 변수/[17:35] enqueue 메소드 호출/[18:20] 예외 상황 처리를 위해 else문 사용/[18:48] bufferitem을 이용해 배열 데이터 선언/[19:53] unlock 함수 호출/[21:00] streamchangecallback 함수/[21:29] eventId 값/[22:05] querystreaminformation메소드 호출/[22:22] log메시지 출력/[23:26] queue를 초기화 하는 함수/[24:05] fread 함수/[25:00] packet의 개수 log메시지로 출력/[25:47] 자바 코드와 연동하기 위한 네이티브 메소드 구현/[27:52] 자바에서 호출하는 네이티브 함수/[28:19] createengine 메소드 구현/[29:10] 반환값의 정보를 담고있는 변수 선언/[30:30] realize 메소드/[30:57] 인터페이스 만들기/[31:21] 출력을 위한 오브젝트와 구체화하는 코드 넣기/[31:55] streamingmediaplayer를 만들 수 있는 메소드 구현/[32:15] utf8변수/[32:59] dataformat/[33:17] audio와 video 데이터 표시를 위한 환경설정/[35:17] createmediaplayer 메소드 호출/[36:35] player에 대한 인터페이스 추가/[37:40] callback을 playerobj에 등록/[37:56] eventsmask 설정/[38:19] 실제로 콜백을 등록하는 코드 추가/[40:09] setplaystate 메소드/[40:40] setplayingstreamingmediaplayer/[41:42] shutdown/[42:39] setsurface/[43:32] rewindstreamingmediaplayer/[44:34] 네이티브 메소드를 라이브러리화/[44:47] 파일 생성/[45:06] 빌드 설정 코드 삽입
- 18.45분 FFMPEG 활용
안드로이드 NDK를 통해 FFMPEG 라이브러리를 가져와 비디오, 오디오 데이터 디코딩 작업 수행하기
책갈피 : [00:10] FFMPEG적용 실습/[00:43] 비디오, 오디오 파일을 디코딩이 가능하게 해주는 라이브러리/[01:10] 플레이어 엔진 만들기/[02:00] 동영상파일 디코딩 구현/[02:23] jni폴더에 c코드 생성 후 디코딩 엔진 구현/[02:42] 헤더파일 추가/[03:46] 디버깅을 위해 다음과 같은 log를 출력할 수 있게 추가/[04:08] pktQueue라는 구조체 만들기/[04:30] 안드로이드 오디오 출력을 위한 핸들러 선언/[05:24] pkt_queue_put함수 구현/[06:12] pkt_queue_get함수 구현/[06:46] decode_audio함수 구현/[08:24] audio_task함수 구현/[09:26] play함수 구현/[09:43] audioflinger_device_start함수 호출/[10:24] audioflinger_device_write함수/[10:56] engine_start함수 구현/[11:26] stream정보를 가져오는 함수 실행/[13:33] audiocodec을 open할 수 있는 부분 구현/[14:20] thread생성/[15:03] video에대한 stream가져오기/[16:33] video함수 설정 함수 호출/[17:18] 실제로 video 디코딩하는 부분 구현/[18:11] 디코딩이 끝난 후 변환작업/[19:00] 변환 함수 sws_getContext/[19:56] hovideo_post함수 호출/[20:29] audio stream경우 처리/[21:56] 안드로이드 비디오와 오디오 서비스 종료/[23:26] audioflinger_wrapper.h파일과 audioflinger_wrapper.cpp파일 만들기/[25:03] audioflinger_device를 세팅하는 래핑함수/[26:03] audioflinger_device_flush함수 호출/[26:26] 엔진과 안드로이드 비디오와 연결하는 부분 추가/[27:48] engine_start함수/[28:33] 랩핑함수의 구현/[28:52] hovideo_prepare함수 구현/[29:22] ecolorformat/[29:52] hovideo_setvideosurface함수/[30:21] hovideo_release함수/[31:30] ffplayjni.c파일 생성 후 헤더파일 추가/[32:07] jni관련 메소드 구현/[32:30] createStreamingMediaPlayer메소드 정의/[33:45] shutdown메소드/[34:06] setSurface메소드/[34:52] 빌드 설정 파일 추가/[35:13] 같이 컴파일 할 소스파일 추가/[35:30] 라이브러리 추가/[35:52] 헤더파일 추가/[36:19] 정적 라이브러리 추가/[36:42] 공유 라이브러리로 빌드하도록 설정/[36:59] java에서 ui구현/[37:15] xml파일 열기/[37:35] button 2개 생성 후 surfaceview추가/[38:34] 생성된 ui개체를 자바코드에 가져다 활용/[39:07] 엔진을 시작하기위한 네이티브 메소드 호출/[39:57] shutdown메소드 호출/[40:22] 버튼 실제 id값으로 변경/[41:00] button과 view에 해당하는 헤더파일 추가/[41:22] 동영상 경로 SourceString변수에 넣기/[42:35] 실제 동영상을 처리하는 부분/[42:57] surfaceView를 ui로 가져오기/[43:27] surfaceholder선언/[43:49] setsurface메소드 호출/[44:07] video를 재생할 경우 surface영역에 표시/[45:04] button까지 import
- 19.47분 PDK 기반 어플리케이션 개발
안드로이드 전체 소스를 이용해서 PDK 기반으로 어플리케이션을 개발하는 방법 알아보기
책갈피 : [00:13] PDK 기반 어플리케이션 개발/[01:23] PDK 설명/[02:12] PDK 사용을 위한 방법/[02:51] vmware player 다운로드/[03:23] 운영체제 설치/[03:49] Ubuntu 12.04.5 LTS버전 다운로드/[04:45] create a new virtual machine/[05:27] 안드로이드 소스 다운로드 후 컴파일 방법 진행/[06:00] java설치/[07:00] 터미널을 연 상태에서 downloads디렉토리로 이동/[08:05] 설치가 끝난 후 java환경변수 등록/[08:22] java_home이라는 환경변수 만들기/[09:15] 안드로이드 소스 빌드를 위한 유틸리티 설치/[09:39] apt-get명령어 사용/[10:20] 디렉토리 생성/[10:48] repo등록 후 권한 설정/[11:28] 전체 소스를 다운로드 받을 폴더 생성/[12:01] 버전 확인 후 다운로드/[13:11] 다운로드 받기위한 명령어 입력/[13:48] 다운로드 받은 소스를 컴파일하고 빌드하는 작업/[14:39] 안드로이드 명령셋 입력/[15:18] 동시 작업개수 선택/[17:44] 에러 해결 방법/[18:30] 에러 해결을 위한 경로 입력/[19:07] 헤더파일 추가/[19:56] 헤더파일에 들어가 변수 수정/[20:26] 해당하는 설정파일을 열고 명령어 입력/[21:41] 컴파일 및 빌드 완료/[22:07] 해당 디렉토리로 이동해서 파일 확인/[23:03] apk와 odex확장자로된 안드로이드 어플리케이션 결과 확인/[24:03] pdk 기반 어플리케이션 생성/[24:30] external폴더/[25:02] ffmpeg 라이브러리 빌드/[25:45] 부분적으로 빌드하기 위한 명령어/[27:07] 저장되는 경로/[28:21] mediaplayer어플리케이션에 불러와 같이 빌드/[29:02] mediaplayer어플리케이션 설정 확인/[29:33] 추가된 라이브러리/[30:30] 추가한 헤더파일의 경로/[31:33] 안드로이드 빌드 설정 파일/[32:12] 공유 라이브러리 추가/[32:49] dex파일을 생성할지 apk파일을 생성할지 결정/[33:30] apk파일이 생성된 부분 확인/[34:36] pdk를 사용해서 어플리케이션을 만드는 순서 정리/[35:13] apk파일을 에뮬레이터에 설치 후 실행/[35:27] sdk다운로드/[36:06] 에뮬레이터를 만들고 실행하기 위해 버전에 맞는 이미지 다운로드/[36:52] ARM EABI v7a system image필요/[37:45] 버전에 따른 이미지 추가 확인/[38:37] 에뮬레이터 이미지 생성 후 만들기/[39:00] 실행 파일을 통해 에뮬레이터 구동/[39:30] avd파일을 만들기 위한 명령어/[40:22] 세부적인 세팅/[40:57] 에뮬레이터 입력 후 실행할 avd파일 입력/[41:35] eclipse실행/[42:45] 안드로이드 시스템 이미지를 에뮬레이터에 불러와 사용하는 방법/[43:30] 안드로이드 전체 소스가 빌드된 결과/[44:30] 옵션 없이 에뮬레이터를 구동시킬 경우/[45:49] mediaplayer어플리케이션 설치/[46:20] 설치된 어플리케이션 실행/[46:45] path지정
- 20.1시간 4분 SDL 라이브러리 기반 어플리케이션 개발
안드로이드로 포팅된 SDL 라이브러리를 NDK를 사용해서 JAVA 코드와 연동하는 실습을 수행하기
책갈피 : [00:47] Android application만들기/[00:49] 프로젝트 생성/[00:59] Empty activity/[01:18] Main activity 생성/[01:39] Public void initSDL() 선언/[01:51] Init SDL(); 생성/[02:03] LoadLibrary class 선언/[02:09] System.loadlibrary로 공유lirary 호출/[02:24] 변수 선언/[02:34] 해당 library객체 생성/[03:14] openGL관련 class 생성/[03:18] GLsurfaceview class 상속/[03:27] 해당 class 생성자 생성/[03:32] DemoRenderer(); 객체 생성/[03:40] Setrenderer로 랜더링작업 수행/[03:46] DemoRenderer class 선언/[04:08] 랜더링이필요한 4개의 메소드 선언/[04:55] Private static native void 지시어사용/[05:19] 헤더파일 추가/[05:30] 변수 선언/[06:16] Ontouchevent 메소드 선언/[06:43] Action값 지정/[07:06] Public static native void 선언(int x, int y, int action)/[07:28] 키보드, 키패드 입력처리/[07:31] Onkeydown, onkeyup함수 override/[07:45] Nativekey 함수 호출/[08:19] 오디오데이터 처리/[08:37] Audiothread class 생성/[08:45] Public AudioTherad(activity parent) 생성/[08:53] 변수 선언/[09:10] run 메소드 override/[09:33] maudio=null 인지 확인/[09:58] 초기화되었는지 확인/[10:11] 오디오정보 셋팅/[10:38] Getminbuffersize(rate, channels, encoding) 선언/[10:52] Maudiobuffer 사이즈 설정/[11:24] Nativeaudioinit2(maudiobuffer);/[11:41] Play 메소드 호출/[12:25] Nativeaudiobufferlock 함수/[12:49] Maudiobuffer 함수/[13:54] 오디오초기화 완료 확인/[14:34] 헤더파일 추가/[15:07] AudioThread 객체 생성/[15:11] DemoGlsurfaceview 객체 생성/[15:21] Setcontentview 함수 생성/[15:31] 변수 선언/[16:11] MGLview.onResume(); 호출/[16:49] Maudio.stop(); maudio.release();/[16:54] MGLview!=null, mGLview.exitapp();/[17:22] Nativekey 메소드 호출/[17:46] Keycode_back/[18:11] NDK 코드 삽입/[18:21] Jni폴더생성/[18:31] SDLlibraries를 삽입/[18:37] SDLlibraries 소스코드 다운/[19:13] SDLlibraries 소스파일 압축풀기/[19:46] Android.mk파일열기/[20:02] SDL관련 디렉토리 컴파일/[20:36] Audio, video 파일 확인/[21:19] SDLlibraries/[21:22] SDLlibraries 소스코드 확인/[21:52] Java_export_name 매크로 사용/[22:35] SDL_java_package_path/[22:59] Java_export_name(demorenderer_nativeinit)/[23:20] Mainthreadwrapper함수 thread 생성/[23:26] Mainthreadwrapper함수 기능/[24:15] Nativeinit함수가 java에서 실행/[24:27] Nativeresize 함수/[25:00] Nativerender 함수/[26:07] 사각형 오브젝트에 좌표값 지정/[26:14] Texture sizes should/[26:58] Viewport 설정/[27:03] glclearcolor 설정/[27:06] glmatrixmode 설정/[27:14] Texture_2D 설정/[27:43] Java에서 Audio 관련 함수/[28:20] SDL_androidaudio 코드/[29:08] Audioformat값들을 jniArray에 삽입/[29:53] Audioformat 생성위치 확인/[30:04] Androidaud_openaudio(_This, SDL_Audiospec *spec)/[30:33] Createdevice/[31:22] Audiothread_nativeaudioinit2/[31:44] NewGlobalRe 함수/[32:01] AudiobufferJNI변수에 할당/[33:06] Maudio.write/[33:25] Nativeaudiobufferlock/[33:31] SDL_mutexP(audiomutex);/[33:52] (*jniEnv)->Releasebytearrayelements/[34:20] Nativeaudiobufferunlock/[34:32] Getbyrearrayelements/[34:42] SDL_mutexV(audiomutex);/[35:28] Nativemouse 함수/[35:36] Nativekey 함수/[35:54] Nativemouse/[36:03] SDL_Privatemousemotion(0,0,x,y);/[37:05] NDK연동을을 위한 ndk-bulid 작업 수행/[37:20] Android.mk 생성/[37:36] Sdl_java_package_path 선언/[37:40] Jaba_export_name 메크로 이름만들기/[38:08] Com_example_sdlport 이름 선언/[38:51] Android.mk 열기/[39:08] cmd 창열기/[39:16] Cmd 창에 ndk-build 작성/[39:27] SDL관련 소스들 컴파일/[39:31] 3개의 정적라이브러리 생성/[39:48] 프로젝트에서 확인하는방법/[40:30] Loadlibrary/[40:52] Blaster 폴더 생성/[41:04] src 폴더 생성/[41:11] src에 main.cc파일 생성/[41:58] 헤더파일 추가/[42:06] SDL.h, SDL_mixer.h 파일 include/[42:18] 메인함수 생성/[42:28] SDL_init 함수 실행/[43:14] SDL_suface *screen; 선언/[43:41] SDL_setvideomode 설정/[44:04] SDL_showcursor(sdl_disable);/[44:29] Loadsurface/[44:54] SDL_loadBMP/[45:05] Newsurface 생성/[45:46] SDL_Setalpha/[45:57] return newsurface;/[46:53] Loadingsprite load/[47:07] bmp파일 실행 함수/[47:35] SDL_setalpha/[48:04] SDL_rect left_btn;/[48:20] SDL_rect_right_btn;/[48:35] sprite기능으로 움직이는 효과/[49:10] SDL_rect walk_rec;/[49:27] SoundInit/[49:48] Mix_openaudio/[50:41] 초기화 된 함수를 메인문에서 호출/[51:08] Loadsample 함수선언/[51:12] Mix_loadwav/[51:26] Mix_volumechunk/[51:41] Mix_chunk*choose=loadsample(sms.wab", 100);/[52:08] SDL_Event event;/[52:30] 무한루프 코드 삽입/[52:43] If(SDL_pollenent(&event))/[53:07] Mousebutton 눌러졌을때 확인/[53:40] SDL_blitsurface/[54:34] Mousebuttondown/[54:42] Mousebuttonup/[55:00] 키패드눌렀을때 반응 설정/[55:34] Mix_playchannel/[55:52] SDL_mousemottion/[56:36] Sprite.x=loop*sprite.w;/[57:04] SDL_flip(screen);/[57:44] Freesample();/[58:04] Using namespace std;/[58:12] 비디오설정/[58:52] Main.cc 파일에 Android.mk 생성/[58:57] 헤더파일 include/[59:24] Application.mk 생성/[59:30] Gnust1_static파일 생성/[59:33] Androidmanifest_xml/[59:50] Virtual Devices manager 실행/[01:00:05] Android4.0.3기반으로 생성/[01:00:20] 설정에 hw.dpad를 yes로 변경/[01:01:22] 실행/[01:01:30] Ndk-build/[01:02:04] Run sdlport 클릭/[01:02:09] 어플리케이션 실행/[01:02:29] 실행결과 확인/[01:03:13] 효과음 확인/[01:03:31] adb push circle.bmp/sdcard 전송/[01:03:51] 기존소스와 비교
'추천강의' 카테고리의 다른 글
Nmap 강의 추천 (0) | 2017.11.07 |
---|---|
Mybatis 교육 강좌 (0) | 2017.11.07 |
labview 2012 교육 추천 (0) | 2017.10.31 |
웹퍼블리싱 [현장실무] 강좌 추천 리뷰 (0) | 2017.10.31 |
텍스트큐브 강의 리뷰 (0) | 2017.10.31 |