parseSdkContent failed
Could not initialize class android.graphics.Typeface
정확히는 위와같이 발생합니다. 그래서 다른 프로젝트를 가져와서 막상 실행시킬려고 하면 에러가 발생하는데 OSX 에서는 $HOME/.android 폴더를 강제로 지워주고 다시 시작하니까 문제 없이 동작합니다.
parseSdkContent failed
Could not initialize class android.graphics.Typeface
정확히는 위와같이 발생합니다. 그래서 다른 프로젝트를 가져와서 막상 실행시킬려고 하면 에러가 발생하는데 OSX 에서는 $HOME/.android 폴더를 강제로 지워주고 다시 시작하니까 문제 없이 동작합니다.
NDK (Native Development Kit Environment) 입니다. 구글은 Java 환경의 SDK 만 가지고 모든 것이 가능할 것이라고 주장했었으나, 몇 버젼 지나지 않아 자신들의 주장을 철회하고 Native C/C++ 프로그램이 가능한 NDK 를 공개했습니다.
왜 NDK 를 사용하는가에 관해서는 몇가지 이유가 있겠지만
- 빠른 연산을 위해서 (아무래도 C/C++ 이 자바 보다 속도가 빠른것은 주지의 사실입니다)
- 수많은 Open Source 들이 아직도 C/C++ 로 되어 있기 때문에
NDK 를 컴파일 하기 위해서 알아야 할 구글에서 만들어둔 Makefile 입니다. Makefile 의 문법을 쓰고 있지만 세세하게 다 작성할 필요 없이 형태에만 맞춰주면 나머지는 빌드스크립트가 알아서 처리를 해 줍니다. 물론 이 방법 말고 OpenSource 를 컴파일하기 위해서는 방법이 따로 필요하지만 그 건 다른 포스트에서 다루기로 하겠습니다.
실제로 예제를 따라 만들어 보면 쉽게 이해가 될 것 같습니다.
NDK 를 개발하기 위한 준비 과정입니다. SDK 와 NDK 를 받아서 적당한 곳에 풀고 SDK 에 관련된 명령을 어디서든 실행할 수 있게 PATH 에 걸어주고, NDK 또한 어디서건 실행이 가능하게 PATH 에 걸어줍니다.
안드로이드 프로젝트를 만들어줍니다. Eclipse (ADT) 에서도 만들어 줄 수 있지만 저는 기본적으로 Command Line 을 선호하므로 Terminal 에서 만들어 줍니다.
디자인 부분을 손봐줍니다. 그냥 간단하게 TextView 하나 생성해 줍니다.
MainActivity 에서 Layout 에서 만들어준 TextView 에 NativeCode 에서 리턴한 문자열을 출력하는 예제를 만들 예정입니다. 따라서 위와 같이 작성해주면 됩니다.
실제로 Android 프로젝트를 빌드하는 과정입니다. 그냥 위 명령 그대로 입력하면 컴파일 될 것입니다.
EDIT: ubuntu 에서 javah 사용시 classpath 를 명시해 줘야 하더군요.
javah -classpath <android-sdk-path>/platforms/android-20/android.jar:$PROJECT_PATH/bin/classes com.comjuck.MainActivity
Native Code 가 위치해야 하는 $PROJECT_ROOT/jni 에 javah 를 이용해서 생성해준 com_comjuck_MainActivity.h 에 대응하는 Body 를 만들어줍니다. 여기서는 HelloNDK.c 로 만들어 주고 위와 같은 코드를 채워줍니다.
AndroidManifest.xml 파일을 열어서 이제부터 NDK 를 사용할 것이라는 것을 지정해줘야 합니다. 딱히 해줄것은 없고 minSDKVersion 정보를 최소 14로 맞춰주는 것입니다.
Native Code를 컴파일 하기 위해서 필요한 Android 용 Makefile 입니다. 현재 지금 있는 것을 컴파일 하기 위해서는 단지 위와 같이 작성해주면 됩니다.
Android.mk 의 예제입니다.
$PROJECT_ROOT 나 jni 디렉토리에서 ndk-build 만 입력하면 컴파일 됩니다. 그리고 다시 $PROJECT_ROOT 에 가서 ant -e debug 를 입력하셔서 다시 컴파일 해주시면 됩니다.
여러가지 방법이 있겠지만 Command Line 을 이용하자면
$ ant -e installd
$ sudo npm install forever -g
$ forever start app.js
$ forever logs
$ forever logs 0
You think you know when you learn, are more sure when you can write, even more when you can teach, but certain when you can program
- Alan Perlis (Yale University computer scientist)