http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=17
안드로이드 소스코드내의 아래의 위치에 존재하는 문서를 참고하시면 안드로이드 Native 라이브러리 및
해당 라이브러리를 static, 또는 dynamic하게 linking하는 Native 애플리케이션을 제작하는 법에 대한 설명이
존재합니다.
~/mydroid/development/pdk/ndk/README
위의 문서를 참조하여, 아래와 같은 절차를 거치시면 다양한 native lib. 및 application을 제작 테스트 해 볼 수
있습니다.
1. 가장 먼저 해야할 일은 다음과 아래의 URL에 있는 문서에서의 다음의 두 절차,
즉 6번까지의 작업과 8번의 goldfish 부분에 대한 build를 마무리 해야 함.
http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=4
중략...
6. 안드로이드 빌드 하기
$ make
8. Kernel 별도로 빌드하기
- goldfish
$ cd ~/mydroid/kernel
$ make goldfish_defconfig ARCH=arm
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
2. ~mydroid/development/pdk/ndk/config/config.mk 를 다음과 같이 수정한다.
<android_full_src_path> 는 각자의 host pc에 설치된 android full source의 root directory 를 지정하면 됩니다.
3. ~mydroid/development/pdk/ndk/sample/Makefile.lib 를 다음과 같이 수정한다.
4. native library 및 application 제작 및 테스트
먼저 ~/mydroid/development/pdk/ndk/로 cd 하신후 부터 아래의 절차를 수행하면 됩니다.
하지만, 아래의 과정을 수행하는 과정에서 shared library를 테스트 하기 위해서는
아래의 예제에 있는 libhello-shared.so 가 반드시 /system/lib 아래에 설치되어야 합니다.
하지만, 현재의 emulator는 /system partition이 ro 모드로 되어 있기 때문에 설치가 불가능합니다.
/system partition을 rw 모드로 바꾸는 작업이 필요한데..번거로울까봐 이곳에서는 가장 간단한 방법(아래의 0번)을
제시하도록 하겠습니다.
0번) emulator의 /system partition을 ro -> rw 로 바꾸는 방법. (필수)
- 아래의 새로운 ramdisk.img 를 다운로드 한다.
ramdisk.img(136.2KB)
- 에뮬레이터에 존재하는 ramdisk.img를 backup한다.
예) android-sdk-windows-1.0_r2 oolslibimages 아래 존재하는
ramdisk.img 를 ramdisk.img.orig 로 rename 한다.
- 위에서 다운받은 새로운 ramdisk.img 를 위의 위치로 복사한다.
- emulator를 실행한다.
1) 간단한 hello world 샘플 애플리케이션 제작
cd ../sample
make clean
make
adb push hello system/app
adb shell
# cd system/app
# chmod 755 hello
# ./hello
Hello from the NDK; no user libraries.
# exit
2) c++ binary hello_cpp.cpp 애플리케이션 제작
make -f Makefile.hello_cpp clean
make -f Makefile.hello_cpp hello_cpp
adb push hello_cpp system/app
adb shell
# cd system/app
# chmod 755 hello_cpp
# ./hello_cpp
C++ example printing message: Hello world!
# exit
4) shared library 제작 및 해당 library를 제작하는 사용하는 애플리케이션 제작
make -f Makefile.lib clean
make -f Makefile.lib sharedlib
make -f Makefile.uselib clean
make -f Makefile.uselib use_hellolibrary-so
adb push libhello-shared.so system/lib
adb push use_hellolibrary-so /system/app
adb shell
# cd system/app
# chmod 755 use_hellolibrary-so
# ./use_hellolibrary-so
Library printing message: Hello from the NDK.
# exit
5) static library 제작 및 해당 library를 static으로 링크한 애플리케이션 제작
make -f Makefile.lib clean
make -f Makefile.lib staticlib
make -f Makefile.uselib clean
make -f Makefile.uselib use_hellolibrary-a
adb push use_hellolibrary-a system/app
adb shell
# cd system/app
# chmod 755 use_hellolibrary-a
# ./use_hellolibrary-a
Library printing message: Hello from the NDK.
# exit
해당 라이브러리를 static, 또는 dynamic하게 linking하는 Native 애플리케이션을 제작하는 법에 대한 설명이
존재합니다.
~/mydroid/development/pdk/ndk/README
위의 문서를 참조하여, 아래와 같은 절차를 거치시면 다양한 native lib. 및 application을 제작 테스트 해 볼 수
있습니다.
1. 가장 먼저 해야할 일은 다음과 아래의 URL에 있는 문서에서의 다음의 두 절차,
즉 6번까지의 작업과 8번의 goldfish 부분에 대한 build를 마무리 해야 함.
http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=4
중략...
6. 안드로이드 빌드 하기
$ make
8. Kernel 별도로 빌드하기
- goldfish
$ cd ~/mydroid/kernel
$ make goldfish_defconfig ARCH=arm
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
2. ~mydroid/development/pdk/ndk/config/config.mk 를 다음과 같이 수정한다.
<android_full_src_path> 는 각자의 host pc에 설치된 android full source의 root directory 를 지정하면 됩니다.
CC := ~/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc AR := ~/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-ar INC := -I<android_full_src_path>/bionic/libc/arch-arm/include -I<android_full_src_path>/bionic/libc/include -I<android_full_src_path>/kernel/include -I<android_full_src_path>/bionic/libm/include -I<android_full_src_path>/bionic/libm/include/arm -I<android_full_src_path>/bionic/libstdc++/include LINK := -nostdlib -Bdynamic -Wl,-T,<android_full_src_path>/build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,-z,nocopyreloc -L<android_full_src_path>/out/target/product/generic/obj/lib -Wl,-rpath-link=<android_full_src_path>/out/target/product/generic/obj/lib <android_full_src_path>/out/target/product/generic/obj/lib/crtbegin_dynamic.o POSTLINK := <android_full_src_path>/out/target/product/generic/obj/lib/crtend_android.o %.o: %.cpp $(CC) $(CFLAGS) -fno-exceptions -fno-rtti $(INC) -o $@ -c $< %.o: %.c $(CC) $(CFLAGS) $(INC) -o $@ -c $< |
3. ~mydroid/development/pdk/ndk/sample/Makefile.lib 를 다음과 같이 수정한다.
NDK_BASE := .. include $(NDK_BASE)/config/config.mk SOURCES := hellolibrary.c OBJECTS := $(SOURCES:.c=.o) LIBS := -lc -lm ALIB := <android_full_src_path>/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a all: sharedlib staticlib # Using shared and static suffixes as these are going in the same directory; # typically you would not do this as you would make only one version, # but if we don't we'll screw up the linking because of linker defaults. staticlib: $(OBJECTS) $(AR) -cr libhello-static.a $(OBJECTS) sharedlib: hellolibrary-shared.o $(CC) -nostdlib -Wl,-soname,libhello-shared.so -Wl,-shared,-Bsymbolic -L<android_full_src_path>/out/target/product/generic/obj/lib $^ $(LIBS) -o libhello-shared.so -Wl,--no-undefined $(ALIB) hellolibrary-shared.o: hellolibrary.c $(CC) -c -fpic $(INC) -o $@ $^ clean: rm -rf *.o libhello-static.a libhello-shared.so |
4. native library 및 application 제작 및 테스트
먼저 ~/mydroid/development/pdk/ndk/로 cd 하신후 부터 아래의 절차를 수행하면 됩니다.
하지만, 아래의 과정을 수행하는 과정에서 shared library를 테스트 하기 위해서는
아래의 예제에 있는 libhello-shared.so 가 반드시 /system/lib 아래에 설치되어야 합니다.
하지만, 현재의 emulator는 /system partition이 ro 모드로 되어 있기 때문에 설치가 불가능합니다.
/system partition을 rw 모드로 바꾸는 작업이 필요한데..번거로울까봐 이곳에서는 가장 간단한 방법(아래의 0번)을
제시하도록 하겠습니다.
0번) emulator의 /system partition을 ro -> rw 로 바꾸는 방법. (필수)
- 아래의 새로운 ramdisk.img 를 다운로드 한다.
ramdisk.img(136.2KB)
- 에뮬레이터에 존재하는 ramdisk.img를 backup한다.
예) android-sdk-windows-1.0_r2 oolslibimages 아래 존재하는
ramdisk.img 를 ramdisk.img.orig 로 rename 한다.
- 위에서 다운받은 새로운 ramdisk.img 를 위의 위치로 복사한다.
- emulator를 실행한다.
1) 간단한 hello world 샘플 애플리케이션 제작
cd ../sample
make clean
make
adb push hello system/app
adb shell
# cd system/app
# chmod 755 hello
# ./hello
Hello from the NDK; no user libraries.
# exit
2) c++ binary hello_cpp.cpp 애플리케이션 제작
make -f Makefile.hello_cpp clean
make -f Makefile.hello_cpp hello_cpp
adb push hello_cpp system/app
adb shell
# cd system/app
# chmod 755 hello_cpp
# ./hello_cpp
C++ example printing message: Hello world!
# exit
4) shared library 제작 및 해당 library를 제작하는 사용하는 애플리케이션 제작
make -f Makefile.lib clean
make -f Makefile.lib sharedlib
make -f Makefile.uselib clean
make -f Makefile.uselib use_hellolibrary-so
adb push libhello-shared.so system/lib
adb push use_hellolibrary-so /system/app
adb shell
# cd system/app
# chmod 755 use_hellolibrary-so
# ./use_hellolibrary-so
Library printing message: Hello from the NDK.
# exit
5) static library 제작 및 해당 library를 static으로 링크한 애플리케이션 제작
make -f Makefile.lib clean
make -f Makefile.lib staticlib
make -f Makefile.uselib clean
make -f Makefile.uselib use_hellolibrary-a
adb push use_hellolibrary-a system/app
adb shell
# cd system/app
# chmod 755 use_hellolibrary-a
# ./use_hellolibrary-a
Library printing message: Hello from the NDK.
# exit