카테고리 보관물: Android

Android NDK build architecture 변경하기

아무 설정 없이 ndk를 build 하면 다음과 같이 arm용 library가 만들어진다.

$ <NDK_PATH>/ndk-build 
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Compile thumb  : hello-jni <= hello-jni.c
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/armeabi/libhello-jni.so
$ file obj/local/armeabi/libhello-jni.so 
obj/local/armeabi/libhello-jni.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

NDK에서 build되는 binary의 architecture를 변경하려면 APP_ABI를 선언해 주어야 하는데, Android.mk에 추가해서는 제대로 동작하지 않는다. JNI directory 아래에 Application.mk file을 만들고  APP_ABI값에 build할 architecture를 설정해 준다. 다음은 x86 바이너리를 생성하는 예제이다.

$ cat jni/Application.mk 
APP_ABI := x86
$ <NDK_PATH>/ndk-build 
Gdbserver      : [x86-4.6] libs/x86/gdbserver
Gdbsetup       : libs/x86/gdb.setup
Compile x86    : hello-jni <= hello-jni.c
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/x86/libhello-jni.so
$ file obj/local/x86/libhello-jni.so 
obj/local/x86/libhello-jni.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

* Build에 사용되는 toolchain은 <NDK_PATH>/toolchains/<architecture>-<version>의 형태로 위치한다.

 

Android device에 quake를 올려보다

Quake는 id software에서 소스를 공개한 게임으로 안드로이드 external 디렉토리에 함께 들어가 있다.

Android의 다른 module들과 마찬가지로 디렉토리에서 mm command로 간단히 컴파일 할 수 있으며, 결과물은 다음 두개의 파일로 생성된다.

out/target/product/PRODUCT/system/app/Quake.apk
out/target/product/PRODUCT/system/lib/libquake.so

하지만 이 파일들을 push 해주고 실행해도 pak0.pak를 찾지못한다면서 멈추는데, pocket quake에 필요한 파일인 것같다. 자세한 내용은 http://quake.pocketmatrix.com/readme.php에 있으며, pak0.pak는 같은 웹사이트(http://quake.pocketmatrix.com/mods.php)에서 다운로드 받을 수 있다.

이제 pak0.pak를 올리고 실행하면 quake의 데모가 실행되는 것을 볼 수 있다. 아무리 화면을 눌러도 아무런 움직임이 없는데 README.txxt를 읽어보니 QWERTY keyboard에 control이 맞춰져 있는것 같다.

The Quake controls are customizable, depending upon the settings of config.cfg,
but the defaults are:

Android     PC Key    Command          Notes
Keypad
----------  --------- ---------------  ----------------------------------
Alt Space   TAB       +showscores      Shows scores in multiplayer games
DPad Enter  ENTER     +jump
Menu        ESCAPE    togglemenu       Shows/hides menu
space       SPACE     +jump
+           +         sizeup           Increases size of screen
,           ,         +moveleft        Strafe left
-           -         sizedown
.           .         +moveright       Strafe right
/           /         impulse 10       Toggle weapons up
0           0         impulse 0
1           1         impulse 1        Select weapon 1 (axe)
2           2         impulse 2        Select weapon 2 (shotgun)
3           3         impulse 3        Double-barrled shotgun
4           4         impulse 4        Nailgun
5           5         impulse 5        Super nailgun
6           6         impulse 6        Grenade launcher
7           7         impulse 7        Rocket Launcher
8           8         impulse 8        Thunderbolt
=           =         sizeup
\           \         +mlook           Mouse look. (Not very useful, as there is no mouse.)
Alt w       `         toggleconsole    Used to enter fancy commands.
w           w         +forward
s           s         +back
a           a         +left
d           d         +right
q           q         +lookup
z           z         +lookdown
v           v         +movedown
f           f         +moveup
t           t         messagemode
DPad Up     UPARROW   +forward
DPad Down   DOWNARROW +back
DPad Left   LEFTARROW +left
DPad Right  RIGHTARROW+right
Alt         ALT       +strafe
@ or /      CTRL      +attack
Cap         SHIFT     +speed
Alt 1       F1        help              (This is just an advertisement in the shareware version
.)
Alt 2       F2        menu_save
Alt 3       F3        menu_load
Alt 4       F4        menu_options
Alt 5       F5        menu_multiplayer
Alt 6       F6        echo Quicksaving...; wait; save quick

 

Jelly Bean의 external directory에 들어 있는것들

문득 jelly bean소스를 받고 external directory를 보니 그 안에 뭐가 들어 있을까 궁금해 졌다. 디렉토리 별로 3rd party 정보를 정리되어 있기도 하고 없기도 해서 google과 wikipedia의 도움을 받아 정리한 문서를 아래의 링크로 걸어둔다.

[Android external directory 문서로 바로 가기 (Google docs)]