Android/App개발2009. 4. 23. 11:21
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 를 지정하면 됩니다.
 
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
Posted by 삼스