Execute Android SDK installer. Select an appropriate installation location (for example, C:\Android\android-sdk), knowing that Android SDK and NDK together can take more than 3 GB of disk space (currently!) with all official API versions installed. As a precaution, avoid leaving any space in the target installation path.
Follow the installation wizard until the end. Check the Start SDK Manager
sdk 설치시 모두 체크하여 설치
The Android SDK and AVD Manager is launched. The Package installation window appears automatically.
Check the Accept All option and click on Install to start the installation of Android components:
모두 수락하여 설치한다.
After a few minutes, all packages get downloaded and a message asking to restart ADB service (the Android Debug Bridge) appears. Validate by clicking on Yes.
Close the application.
Now, unzip Android NDK archive into its final location (for example, C:\Android\android-ndk). Again, avoid leaving any space in the installation path (or some problems could be encountered with Make).
To easily access Android utilities from the command line, let’s define the environment variables:
Open the Environment Variables system window, as we did in the previous part. Inside the System variables list, insert the ANDROID_SDK and ANDROID_NDK variables with the corresponding directories as values.디렉토리, ANDROID_NDK 변수이름, 값은 설치한 디렉토리 각각 만든다.
자바(se) SDK 설치시에도 JAVA_HOME 아니면 JAVA_HOMEW 이런 이름 으로 환경 변수를 만들고 자바를 설치한 디렉토리를 값으로 예) C:\Program Files\Java\jdk1.7.0_09 이런씩으로 갑을 넣어주세요.
윈도우 고급속성 - 환경 변수 - 시스템변수 에서 새로 만들기 ANDROID_SDK 변수이름, 값은 설치한
Append %ANDROID_SDK%\tools, %ANDROID_SDK%\platform-tools and %ANDROID_NDK%, all separated by a semicolon, to your PATH.#android ndk,sdk 또는 ant, cygwin 설치시 중복되는 환경변수 이름으로 설정이 무효화나 에러가# ANDROID_SDKW, ANDROID_NDKW,JAVA_HOMEW <- 이런식으로 바꾸어주세요. 물론 PATH에 있는것도 같게 바꾸어주어야 겠죠~
#날수 있으니 꼼꼼히 살펴보고 성정해주어야 한다. (이름중복된다 생각할 경우 변수이름을
윈도우 고급속성 - 환경 변수 - 시스템변수 - path 에 위와 같이 설정을 해준다.
All the Windows environment variables should be imported automatically by Cygwin when launched. Let’s verify this by opening a Cygwin terminal and checking whether NDK is available:
$ ndk-build --version
Now, check the Ant version to make sure it is properly working on Cygwin:
The first time Cygwin should emit a surprising warning: paths are in MS-DOS style and not POSIX. Indeed, Cygwin paths are emulated and should look similar to /cygdrive/<Drive letter>/<Path to your directory with forward slashes>. For example, if Ant is installed in c:\ant, then the path should be indicated as /cygdrive/c/ant.
$ ant -version
Let’s fix this. Go to your Cygwin directory. There, you should find a directory named home/<your user name> containing a .bash_profile. Open it in edition.
At the end of the script, translate the Windows environment variables into Cygwin variables with the cygpath utility. PATH does not need to be translated as this essential variable is processed automatically by Cygwin. Make sure to use the prime character (`) (to execute a command inside another), which has a different meaning than the apostrophe (‘) (to define a variable) with Bash. An example.bash_profile is provided with this book:export ANT_HOME=`cygpath -u "$ANT_HOME"` export JAVA_HOME=`cygpath -u "$JAVA_HOME"` export ANDROID_SDK=`cygpath -u "$ANDROID_SDK"` export ANDROID_NDK=`cygpath -u "$ANDROID_NDK"`# 안되는 부분이 있으니 신경써서 설정해주자.#위와같이 설정을 하고나서 cd $ANDROID_NDKcd $JAVA_HOME
을 해보아서 각각 디렉토리로 이동이 되면 설정이 적용된것이고 안되면 변수값이 중복되어 설정이 무효되거나 잘못 코드를 쓰여 인식이 안되는것이니 꼼꼼히 살펴보자.저는 이부분 때문에 설정이 안되어 골치 썩었습니다,꼼꼼히 보더니 중복 부분과 틀린 부분이 있더라구요.(202psj.tistory.com)
cd $ANT_HOME
cd $ANDROID_SDK
#위 export는 자바 환경변수등록으로 설정한 값들이다. #하나라도 틀리면 인식이 안되니 조심하자 #ndk,ant,cygwin를 인스톨하면서 같은 환경변수이름으로 등록되는 경우도 있으니 #설정하는데 꼼꼼히 살펴보자.
# =' <- 여기부분은 띄움없이 바로 붙여서 써주어야한다. 띄움해도 되는부분과
#만약 ms-dos 스타일로 위 그림과 같은 문구가 나온다면 아래와 같이 설정을 해준다.
Reopen a Cygwin window and check the Ant version again. No warning is issued this time: 위 같이 ant 버전 명령 결과가 나와야 한다.
$ ant -version
What just happened?
We have downloaded and deployed both Android SDK and NDK and made them available through command line using environment variables.
프로젝트중 여러 앱을 배포해야 할 경우 이클립스로 릴리즈 하는것 보다 ant를 이용하여 빌드하는 것이 더 효율적인 경우가 있습니다. 지금 수행 중인 프로젝트가 그러한 경우인데요, 저와 같은 도움이 필요한 분들을 위해 글을 작성해 보겠습니다. 단일 앱을 계발하시는 분들은 굳이 ant로 빌드하실 필요가 없기때문에 필요가 없을 수도 있지만 읽어 두시면 해는 되지 않으실 것입니다.
1. 환경변수를 설정합니다. ant, android, java_home을 각각 설정합니다. 잘 설정이 되었는지를 확인 하는 방법은 설정을 하신 후에 cmd로 ant, android, java를 입력했을때 도움말이 나오면 설정이 된 것입니다.
2. 프로젝트의 build.xml파일을 생성합니다.(자동으로 생성해 주더군요.. 저는 이것도 모르고 만들고 있었다는...) 해당 프로젝트의 위치에서 android update project --path ./ --name 프로젝트 이름 을 입력하시면 build.xml파일이 생성됩니다.
3. build.xml파일을 작성합니다. android root의 tools> ant> main_rules.xml파일을 복사하여 적당한 위치에 추가합니다. 그냥 죽 복사하여 붙여넣기 하시면 될 겁니다.
4. auto sign할려면 build.properties파일을 생성하여 다음과 같이 입력합니다. key.store=.keystore파일위치 key.alias=키스토어 alias key.store.password=키스토어패스워드 key.alias.password=키스토어alias패스워드
5.ant release를 입력하여 릴리즈합니다. 만일 에러가 난다면 build.xml파일의 해당위치에 적당한 코드를 입력하여 다시 빌드 합니다.
Cygwin을 사용하는 이유는 기본적으로 Android 개발 환경이 Linux 기반으로 되어 있기 때문이고, ndk-build 명령으로 빌드하기 위함입니다. 개인적으로 MinGW를 사용하시는 분은 MinGW에서 하셔도 좋습니다.
Cygwin 설치 시에 Select Packages 단계에서 'make'를 체크 후 설치해 줍니다.
저는 이미 설치되어 있기 때문에 'Keep'이라고 나오는 것입니다. 'Skip'부분을 클릭하면 'Install'로 바꿀 수 있습니다. 같은 방법으로 Search 기능을 이용하여 'vim'을 검색 후, Editors 카테고리의 vim을 'Install'로 바꾼 후 설치해 줍니다. 혹시 나중에 추가로 필요한 패키지가 생길 경우 다운받은 Cygwin 폴더의 setup.exe를 실행시켜 패키지를 추가할 수 있습니다.
다음으로 Cygwin을 실행하여 ndk-build 명령을 어디서든 실행할 수 있게 하기 위해 .bash_profile 파일의 PATH 환경변수에 경로를 추가시켜 줍니다.
/cygdrive 는 윈도우의 '내컴퓨터'와 같은 경로입니다. 저의 경우에는 다운받은 NDK 폴더가 아래의 경로에 있기 때문에 그림과 같이 PATH설정을 해 준 것입니다. 본인의 경로에 맞게 수정해주면 됩니다.
D:\UTIL\etc\Android_NDK_r4b\android-ndk-r4b
그럼 이제 cygwin은 모두 준비가 끝난 상태입니다.
3. Eclipse Android Project 생성
이제 Eclipse를 이용하여 안드로이드 프로젝트를 만들어 보도록 하겠습니다.
먼저, [File]->[New]->[Project]를 선택하면 다음과 같은 창이 나옵니다.
Android Project를 선택한 후, Next를 클릭합니다.
아래 그림과 같이 빈 곳을 채워준 다음 Finish를 클릭합니다. 이 때, 저는 "Use default location"을 체크해제한 후, cygwin의 홈디렉토리에 프로젝트 폴더를 만든 후 이곳의 경로를 지정해 주었습니다.
다음 그림과 같이 프로그래밍할 준비를 마쳤습니다.
4. 예제 프로그래밍
그럼 이제 본격적으로 안드로이드 App 예제를 실행하기 위한 프로그래밍을 해 보도록 하겠습니다.
① Activity Layout 구성 위치 : [HelloAndroid]-[res]-[layout]-[main.xml] 텍스트뷰와 버튼을 각각 하나씩 추가합니다.
③ Class 만들기 위치 : [HelloAndroid]-[src]-[ssu.os.android]-[NativeCall.java] 위의 위치에 NativeCall.java 파일을 새로 생성합니다. native 함수가 들어있는 NativeCall 클래스를 생성합니다. native 키워드는 javah가 헤더파일을 생성할 때 참조하게 되는 키워드 입니다. 구현부는 없습니다. static 부분은 class의 객체가 생성될 때 (new) 되어질 때 호출됩니다. "my_lib"는 ndk-build로 생성된 라이브러리 이름입니다. 파일명은 libmy_lib.so 입니다.
//---------------------------------
package ssu.os.android;
public class NativeCall {
static {
System.loadLibrary("my_lib");
}
public native String stringFromJNI();
public native int add(int a, int b);
}
//-----------------------------
④ javah 실행 ~/bin 디렉토리에서 javah를 실행합니다. javah는 내부적으로 ./ssu/os/android/NativeCall.class 파일을 참고하여 헤더파일을 생성하게 됩니다. 헤더 파일명은 패키지명과 클래스명을 참고해서 생성됩니다. -o 옵션을 사용하면 파일명을 임의로 지정할 수 있습니다. 프로젝트 폴더에 /jni 폴더를 생성하고, 만들어진 헤더파일을 옮겨줍니다.
- 생성 된 헤더파일(ssu_os_android_NativeCall.h) 내용 native 키워드로 되어있던 함수들이 jni 형태 함수 프로토타입을 확인할 수 있습니다. 복잡해 보이지만 C문법입니다.
//----------------------------------------------
/* DO NOT EDIT THIS FILE - it is machine generated */
⑤ 함수 구현 위치 : [HelloAndroid]-[jni]-[my_lib.c] /jni 폴더에 my_lib.c 파일을 만들어서 다음과 같이 함수를 구현합니다. 두 개의 함수가 있는데 단순히 string을 리턴해 주는 함수와 두 정수를 입력받아 더한 후 리턴하는 함수입니다.
JNIEXPORT jint JNICALL Java_ssu_os_android_NativeCall_add(JNIEnv *env, jobject obj, jint a, jint b)
{
return a + b;
}
//-----------------------------------------
⑥ Android.mk 파일 작성 위치 : [HelloAndroid]-[jni]-[Android.mk] 다운받은 Android NDK 폴더의 /sample/hello-jni/jni 의 Android.mk 파일을 현재 프로젝트의 /jni 폴더에 복사한 후, 다음과 같이 수정하여 사용합니다. 수정 된 내용은 19, 20 라인의 LOCAL_MODULE 과 LOCAL_SRC_FILES 입니다.
//--------------------------------------
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
안녕하세요~^^ 남들보다 늦게 Android 를 시작하게 되네요...! 하지만, 늦더라도 천천히, 꼼꼼히 짚고 넘어가도록 하겠습니다.
현재 기본적으로 Android 가 설치가되어 있다고 생각 하겠습니다. 그리고 NDK 를 설치하기 위한 데이터를 알아보도록 할까요?
시작 해볼까요!? 작성하는데 얼마나 시간이 걸릴지^^;;
접기
# What is NDK?
안드로이드 애플리케이션에서 native code( C,C++)를 사용하는 모듈 등을 추가하기 위해 개발자에게 제공되는 툴!
# NDK 에서 제공되는 것들 - C/C++ 소스코드로 부터 네이티브 라이브러리를 생성하기 위한 각종 툴 및 빌드 파일 - 네이티브 라이브러리를 안드로이드 배포용 패키지 파일(apk)에 삽입하기 위한 방법 - 안드로이드 SDK(1.5버전 이후)를 지원하기 위한 시스템 헤더 및 라이브러리 - 문서, 샘플, 튜터리얼
#Cygwin - Unix 계열 프로그램/유틸리티를, MS윈도에서 사용할 수 있도록 하는 커맨드 라인 인터페이스 - Cygwin을 Window에 설치하면 grep 이나 diff 등, 리눅스/유닉스의 명령어들을 사용할 수 있습니다. (일부제외)
#Contents of the NDK - libc(C Library) headers - libm(math library) headers - JNI interface headers - libz(Zlib compression) headers - liblog(Android logging) headers - A Minimal set of headers for C++ support
# Kaist 가 가장 속도가 빠르다고 하네요..(ftp://ftp.kaist.ac.kr ) 을 선택하도록 합니다.
# 필수항목 선택 devel(gcc-core, gcc=g++, make, vim(맞던가..) ) 를 선택 하면 됩니다. 귀차니즘으로 인해 Devel 을 클릭해서 전부 설치를 하였네요..^^;;
# 뒷부분은 생략하도록 하겠습니다. 설치 프로세스와 마지막 확인 누르는 화면인데 미리 캡쳐를 해두지 못했네요..^^
# 환경설정
위쪽의 환경변수에 새로만들기 를 하여 추가를 하도록 합니다.
아래의 그림처럼 변수이름 : HOME 변수 값 : /home/(사용자이름)
# 설치가 되고 [시작]-[프로그램]-[Cygwin]-[Cygwin Bash Shell] 을 실행합니다.
# 처음 실행할 때는 바로 떳는데 ... 어느센가 살포시 검은창이 조금 오래 있네요..
# 아래의 그림처럼 뜬다면 설치가 성공한 것입니다. 만약 문제가 있다면 다시 따라서 해보시기 바랍니다. 그리고 Cygwin 을 설치하는 과정에서 패키지를 다운받다가 끊키는 경우가 많은데...모든 패키지를 다 받지 마시고 필요한 Devel 만 받기를 권합니다. 받는데도 시간이 30~1시간 가량 걸리더군요... 기다리면서 포스팅이 시작이 되어버렸죠 하하...
# 이상 Cygwin 설치과정은 여기서 종료가 되겟습니다. 그리고 다음 과정을 보도록 합시다.
접기
# Android NDK 설치 이번에는 Android NDK 를 설치하도록 해보겠습니다. 아래의 설명대로 따라와 주신다면 어려운 것은 별로 없습니다. 글자보다. 이미지를 많이 첨부하도록 할터이니, 부디 아까운 시간을 버리지 말고 천천히 따라와 주시기 바랍니다.
export ANDROID_NDK_ROOT=/home/(사용자 계정)/(패키지 마다 버전이 틀리니 폴더확인!)
# 이렇게 하면! Android NDK 가 설치가 끝이 납니다.
접기
Reference
[1] cwisky@paran.com 님의 블로그 ( http://micropilot.tistory.com/1522 ) - 아무래도 책 2권의 NDK 를 보고, 구글에서 검색된 포스팅인데...의외로 꼼꼼히 정리가 잘되어 있었습니다. 하지만 처음 보는 저한테 이미지가 부족한 ㅜ_ㅜ 조금더 제가 꼼꼼히 작성해보리라 ...합니다. [2] S5PC100기반 안드로이드 포팅 및 응용프로그램 개발(주) 휴인스 - 특강을 들었던 (주) 휴인스 강사님의 얇지만 탄탄한 내용의 자료를 참조하여서 작성하였습니다.
어라라...? 셋팅을 정리하고나니, 먼가 많이 부족한 느낌이 드네요...전 셋팅할 때 뭔가...엄청 복잡했거든요... 이번강좌를 이렇게 줄이고, 예제를 따라 해보도록 하겠습니다.
NDK 를 설치하고나면 Sample 폴더 아래에 많은 예제가 있습니다. 그 예제들이.................!? 강좌가 많이 있더라구요..그래서 전 책에 있는 계산기 예제를 해보려고 합니다. 그럼 다음 포스팅에서 뵙겠습니다.
1. Android Project 작성 2. 자바 클래스 작성 3. Header 파일 작성 4. 라이브러리 생성할 소스 디렉토리 생성 5. Android.mk 설정 파일 생성 6. C 소스파일 작성 7. 소스 컴파일/공유라이브러리 생성 8. Native 메소드 호출 9. 결과 확인
에효, 한숨 쉬면서 시작 해볼까요? 절차라 머저리 긴지...정리하는 저두 부담이 되네요 ㅎ 아 그냥 포스팅,,,하면서 프로젝트 하나 다시 만들어 볼께요 =ㅅ=!! 최대한 이미지를 많이 쓰기위해서죠.
1. Android Project 작성
# 안드로이드 프로젝트 생성을 합니다. ( 알고 계신대로죠~)
@ 주의사항 안드로이드를 D:\android\worksapce 의 경로로 저장을 하였습니다. 하지만 Cygwin 폴더로 있는 곳으로 한번 이동을 해야합니다. 그이유는 Build 를 하기위해서, java header 파일을 만들기 위해서죠.
하지만, 다른 방법도 있다는 사실, Cygwin 의 Path 경로를 옮겨오는 것도 하나의 방법 이니깐요.. 설명하는 지금은 Export/Import 를 이용하여서 Cygwin/jppark(사용자계정)/(project) 로 옮겨왔습니다. Export/Import 하는 방법이 궁금하시다면 ->__(포스팅을 다시하겠죠? ㅎㅎ)
# New Android project Project name : NDKclac Build Target : Android 2.1-update1 Application name : Hello! NDK! Package name : com.tistory.studyandroid Create Activity : NDKcalc Min SDK version : 7
2. 자바 클래스 작성
#자바 클래스를 작성합니다. (설명을 위해서 주관적으로 말을 합니다. 틀린 부분이 있다면 지적 부탁드립니다. 단지! 이게 필요하다는 설명을 위해서...주절주절 쓰고있습니다^^;;)
- 엥~!? 왜 작성하냐구요? 지금 이 포스팅을 보고 계신분은 NDK 라는 것을 이용하여 C/C++ 코드를 사용하기 위함이 아니시던가요? 그럼 필요한게 무엇인가요!? header 파일이 필요하지 않나요?
NDK 에서 C/C++ 의 Header 파일을 만들기 위해서는 먼저 Java 를 이용하여 헤더파일을 작성하고나서 javah 명령을 통하여 JNI에 사용되는 header 파일을 생성하도록 합니다 .
3. Header 파일 작성
# calc.java File
(이미지로 해둬어서 찝찝하시죠? 복사 붙여 넣기도 못하고? ㅎㅎ 그래서 아래 ..준비했습니다
package com.tistory.studyandroid;
public class calc {
public native int add(int x, int y); public native int mul(int x, int y); public native int div( int x, int y); static { System.loadLibrary("calc"); // libcalc.so 파일을 로드함 } }
#main.xml File
디자인은 별로지만, 위와같은 형태로 구성을 하기위해서 xml 을 작성합니다. 설명하지 않아도 작성을 충분히 할 수 있을 꺼라 생각됩니다. 물론 저도 Android 를 본지 3일째인가요!? NDK 가 그냥 필요해서 보고 정리하는거라,,,앞에 내용은 후르륵~ 라면 먹듯이 보고 넘어왔네요 ,,, 새벽 4시를 달리며,,,라면 먹고 싶네요 =ㅅ=
# 이제 NDKcalc Project 에서 jni 폴더를 하나 생성을 합니다. # jni 폴더는 자동으로 생성이 되지 않으므로 수동으로 생성을 해주어야 합니다. 방법은 탐색기 폴더에서 생성하는 것과 아래 프로젝트에서 생성을 할 수 있습니다.
# jni 라고 폴더이름을 적어준다.
# 이제 jni 폴더에 이제 Android.mk 파일을 생성하도록 합니다.
5. Android.mk 설정 파일 생성
Android.mk 파일은 NDK가 make 파일을 이용하여 네이티브코드를 컴파일 하고 빌드할 때 참조하는 파일입니다. 위치는 위의 네이티브 코드가 존재하는 "$Project/jni" 폴더 내에 존재하여야 합니다.(참조[2])
# Android.mk File 작성
소스파일 긁어가자!
접기
소스파일은 다음과 같습니다.
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := calc LOCAL_SRC_FILES := calc.c include $(BUILD_SHARED_LIBRARY)
이제 설명이 필요하겟죠? (참조[2])
# LOCAL_PATH := $(call my-dir) - 컴파일하고자하는 소스 파일의 위치를 언급 - $(call my-dir) 은 "my-dir"라고 불리우는 매크로 함수를 호출(call)하는 것을 의미 - 결과적으로 LOCAL_PATH 에는 "<프로젝트 폴더>/jni" 가 할당될 것
# include $(CLEAR_VARS) - CELAR_VARS 변수는 "clear-vars.mk" 로 선언되어 있음 - "include $(CLEAR_VARS)" 라는 의미는 "clear-vars.mk" make 파일을 여기 Android.mk 파일에 포함하라는 의미가 됨 - -
# LOCAL_MODULE := calc - Android.mk 파일 내 최종 생성되는 모듈을 위해 선언되어야 할 변수 - calc 라고 정하면 최종 결과물은 "/libs" 디렉터리 내에 "libcalc.so" 라이브러리 생성
# LOCAL_SRC_FILES := calc.c - 모듈을 제작하는데 사용하는 C와 C++ 의 소스 파일들을 가르킴 - 만약 라인을 띄어서 다수의 파일명을 입력한다면 아래와 같이 사용가능
LOCAL_SRC_FILES := foo.c \ toto/bar.c
# include $(BUILD_SHARED_LIBRARY) - 생성되는 라이브러리는 공유라이브러리로 제작한다는 의미 - 정적 라이브러리로 하고 싶다면 $(BUILD_STATIC_LIBRARY) $(LOCAL_STATIC_WHOLE_LIBRARIES) (but, 안드로이드에서 제공하는 NDK에서는 정적 라이브러리 제작에 필요한 파일들이 빠져있어 정상적인 방법으로는 정적 라이브러리를 생성시킬 수 없음)
접기
6. C 소스파일 작성
# calc.c File 작성 C 파일도 새롭게 작성을 하기위해서 파일을 추가합니다. 아무래도 그림이 빠져있으면??? 도대체 어디서 해야하는지 영문을 모르는 분들을 위해서 한장 첨부합니다. (물론 저도 그랬으니깐요 ㅎㅎㅎ)
@신규 빌드 작업 : ndk-build @신규 빌드 및 빌드 명령어 출력 : ndk-build V=1 @이전 바이너리 파일 삭제 : ndk-build clean @강제 리빌드 작업 : ndk-build -B @강제 리빌드 및 명령어 출력 : ndk-build -B V=1 @빌드 작업과 NDK 로그 메시지 출력 : ndk-build NDK_LOG=1
@Build 되어 생성된 so 파일 확인 생성되는 파일! 중요하지만 간지러우신 분들만 확인 바랍니다. ㅎㅎㅎ
더보기
8. Native 메소드 호출
# NDKcalc.java File 본문의 소스내용을 작성합니다. Native 가 사용된 곳에 표시를 해두겠습니다.
더보기
9. 결과 확인 휴...드디어 결과를 보는군요...!!! 행복합니다.
# 실행 할 줄은 알죠? 현재 3일 공부한 저두 하는데~ 이런건 기본이죠?
# 아아앗!? 그런데 왜 에러인가요!? 물론 블로그에 있는 내용을 긁어다가 사용하신 분들이라면 될려나? 좀 많이 간지럽죠. 이렇게 글을 계속 읽고 있다는 것은,,,안된다는 뜻이 아닐까 싶기도 한데(앗! 그냥 혼잣말이에요, 기분나빠하지 마시길^^;;)
에효..에러가 떳으니 왜 떳는지..알아봐야하겠죠? 그나저나...저 포스팅을 하는 지금.. 하루만에 찾기는 했지만, 도통 NDK 의 구조가 갈피도 잡히지도 않고, 인터넷에 아무리 검색해봐도 되지도 않고,, 그렇다고 인터넷에 따라해도 되지도 않고...그러더군요...
현재 포스팅을 하는 초기에도 몰랐습니다.물론 제가 스스로 간지러워서 젤처음에 이야기한 프로젝트를 제가 직접 만들면서 캡처를 한다고 이야기를 하였는데.. 지금의 에러가 어디서 나는지 찾기 위해서 이런 삽질을 하고 있습니다. 60억 인구중에 누군가가 똑같은 에러를 만날테고...같은 생각을 하고 있을테니깐요... 같은 생각을 하는 이유는 같은 행동을 하고 같은 것을 바라보고 같은 것을 먹고...등등...
그러하니깐요...아무도 나와 같은 생각을 할 수 없게 하려면 ?... 어떻게 해야할까요? 무념무상..?? <-- 꼬숙이(후배)가 말하는 저말이..정답일지...갑자기 생각나서 주절주절....
그만큼 -_-..지금 일어난 에러에 대해서...한이 좀 맺혀있나보네요... 참...정확하지는 않지만 에러는 금방 잡았습니다. 이유가 이유라면 잘못적은 오타 라고 보시면되죠.. 확인 해볼까요?
etc. 에러난 이유를 알아보자.
# 에러가 어디서 난 것일까? 천천히 하나씩 살펴 보았습니다. 삽질을 하는 지금까지, 똑같은 프로젝트를 몇번이나 만들어 보았을까요?
#calc.java File 입니다.
@: ㅡㅡ^ 아래의 그림을 보시면, 생성된 library 파일은 libcalc.so 입니다. @ 즉, NDKcalc 라는 파일이름은 이미 현재 파일 추가가 되어있는 Zip 내의 내용입니다(과거의 내용). 이러한 상황이 왜 발생했냐? 책이랑 인터넷이랑 보고 여러번 프로젝트 만들면서 복사/붙여넣기를 하면서 수정하지 않은 탓이지요...(물론 제잘 못입니다. 누구나가 처음에 범하는 실수죠...)
@ 그렇다면...누군가가 좀 명시를 해줘야 하지 않나? 이건 주의사항으로 좀 알려 달란!! 이런 말입니다.
그래서...
@주의사항 1. Header 파일을 생성하기위한 calc.java 파일과 생성되는 lib(header name).so 파일명은 일치해야한다.
설명이 부족하네요... Header 파일을 생성하기 위한 java header 에 사용된 이름과, 빌드를 통하여 생성된 so 파일의 이름은 아래와 같아 야 한다는 공식입니다.
java header Vs Library.so File
HeaderName = libHeaderName.so
# 간결하지 못한 느낌인데... 더 적었다간 해깔릴 것이라 생각 되어 이만 작성합니다.
# java header 파일을 다시 생성 함 java header 파일을 수정하였으므로 다시 생성하도록 합니다.
# 에러가 발생한 곳이 하나 더 잇었네요..^^;;
현재 본 포스팅의 5번째 C소스 파일 작성을 보면 아래 그림에 붉은색으로 밑줄 그어져 있는 부분과 다르다는 것을 알게 될 것입니다.완전 초보적인 실.수. 네요... 당연히 전 안드로이드를...보는 3일 초짜입니다. 물론...개발자로서는 오래 있었을지도 모르지만요..(비참하군요..이런 실수를 한다는게..)
# 프로젝트 ReBuild 하기 C 소스 코드를 수정하였으므로 so 파일을 다시 생성을 해야겠죠? 아래의 그림과 같이 다시 빌드를 합니다.
휴..드디어 끝이났다. 이제 결과를 보도록 할까요? 디자인은 별로지만! 끝을 제대로 확인하지 않으셨던가요!?
#결과 화면
결과를 보셨으니 행복하시죠!? 그리고..전 새벽 5시가 되어서 포스팅이 끝이 나네요... 아직 포스팅이 끝났다고는 말못합니다. NDK 에 대한 빠진 내용을 책을 참조해서 다시 계속 정리를 할 것이니깐요...
그럼 계속...열심 히! 포스팅 하는 것 기대해 주시기 바랍니다.(헐...3시간 걸렸네..ㅜㅜ)
2011.11.07
cygwin 에서 ndk-build 명령어 수행을 위한 방법
방법은 간단합니다.(....)ㅠ
시스템 환경 변수 PATH 에 NDK 경로를 추가해 주면 됩니다.
exmaple 을 보셔야 이해 하시겠죠?
(현재 위에랑 setting 을 바꾸었습니다. )
.bashrc 파일에서 export ANDROID_NDK_ROOT=/home/android-ndk-r6b 경로 수정 (실제 C:\cygwin\home\android-ndk-r6b 입니다.)
그리고 시스템 [내컴퓨터]-[환경변수]-[PATH] 란에 C:\cygwin\home\android-ndk-r6b 를 넣어줍니다.
아아 그림이 없으니 내가 알아보기도 힘들겠다....
그리고 .bashrc 파일에 export PATH=$PATH:/home/jppark/android-ndk-r5b (이전 버전) 이렇게 추가하면 되는거 같은데 안되나보네..ㅡ.ㅡ.... 파일에서 path 거는 방법 아시는분 댓글 좀 부탁들비니다^^
이상~!!
Reference
[1] cwisky@paran.com 님의 블로그 ( http://micropilot.tistory.com/1522 ) - 아무래도 책 2권의 NDK 를 보고, 구글에서 검색된 포스팅인데...의외로 꼼꼼히 정리가 잘되어 있었습니다. 하지만 처음 보는 저한테 이미지가 부족한 ㅜ_ㅜ 조금더 제가 꼼꼼히 작성해보리라 ...합니다. [2] 전문가로 가는 안드로이드 마스터 프로젝트 (주) 교학사 - 도서관에서 NDK 가 있어서 빌린 책입니다. 가지고 있는 안드로이드 책 한권으로 부족함을 느끼고, 인터넷을 찾아보면서 하는 것도 한계가 있기 때문에 도서관을 찾아나섰습니다. 책을 빌려놓고 한달간 보지도 않았네요..그리고 특강을 듣기 시작하면서 보게 되었는데...물론 필요한 부분만^^;; 그래도 그냥 버린게 아니라서 다행이네요..
ndk-build는 현재 디렉터리(또는 -C 옵션으로 지정된 디렉터리)에서 AndroidManifest.xml를 찾습니다. 그 파일이 있으면 현재 디렉터리를 유효한 안드로이드 프로젝트 디렉터리라고 간주하고, 그 디렉터리의 jni 디렉터리로 들어가서 거기에 있는 Android.mk에 의거해서 빌드를 진행합니다(GNU make로). 그것 뿐입니다.
위의 과정에서 보듯이, r3까지 쓰이던 Application.mk는 이제 필요가 없습니다. 물론 NDK 루트에서 make APP= 를 실행하는 방식을 사용하려면 여전히 Application.mk가(그리고 apps 디렉터리가) 필요합니다.
이 정도만 알면 코드의 실질적인 오류, 즉 컴파일 오류나 링크 오류 이전의 사소한 문제점들은 충분히 해결할 수 있을 것입니다.
위 링크로 가시면 문자열 값을 출력하는 것 까지 자세한 정보가 있습니다. 그대로 따라하시면 되는데요. 사이사이에 제가 겪은 문제점들을 적어 놀까 합니다.
1. ../ndk-build 명령어를 쳤더니
위와 같은 에러가 났을 경우. 혹시, android ndk 가 Program files 밑이나 띄어쓰기가 있는 이름 폴더의 하위 폴더 일 경우 인지 확인해보세요. 절대! cygwin 설치에 문제가 아닙니다. 가장 안전한 방법! c:\android-ndk-xxxx로 해놓으시는게 가장 좋을 듯!