android中移植 c/c++程序

android中移植 c/c++程序

   在android的linux內核中要移植 c/c++程序,一般要編譯成static的,而若要運行dynamically linked的程序,則要按照android的相關機制。
Android 並沒有採用glibc作爲C庫,而是採用了Google自己開發的Bionic Libc,它的官方Toolchain也是基於Bionic Libc而並非glibc的。
這使得使用或移植其他Toolchain來用於Android要比較麻煩:
與glibc相比,Bionic Libc有如下一些特點:
-          採用BSD License,而不是glibc的GPL License;
-          大小隻有大約200k,比glibc差不多小一半,且比glibc更快;
-          實現了一個更小、更快的pthread;
-          提供了一些Android所需要的重要函數,如”getprop”, “LOGI”等;
-          不完全支持POSIX標準,比如C++ exceptions,wide chars等;
-          不提供libthread_db 和 libm的實現
另外,Android中所用的其他一些二進制工具也比較特殊:
-          加載動態庫時使用的是/system/bin/linker而不是常用的/lib/ld.so;
-          prelink工具不是常用的prelink而是apriori,其源代碼位於” /build/tools/apriori”
-         strip工具也沒有采用常用的strip,即“/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin”目錄下的arm-eabi-strip,
               而是位於/out/host/linux-x86/bin/的soslim工具。


===================================================================
Android編譯環境 - 編譯Native C的helloworld模塊


    Android編譯環境本身比較複雜,且不像普通的編譯環境:只有頂層目錄下才有Makefile文件,而其他的每個component都使用統一標準的 Android.mk.
Android.mk文件本身是比較簡單的,不過它並不是我們熟悉的Makefile,而是經過了Android自身編譯系統的很多處理,編寫一個新的Android.mk來給
Android增加一個新的Component會比較簡單。

在Android 中增加一個C程序的Hello World:
1. 在$(YOUR_ANDROID)/development 目錄下創建hello目錄,其中$(YOUR_ANDROID)指Android源代碼所在的目錄。
- # mkdir $(YOUR_ANDROID)/development/hello
2. 在$(YOUR_ANDROID)/development/hello/目錄編寫hello.c文件,hello.c的內容當然就是經典的HelloWorld程序:

#include <stdio.h>
int main()
{
 printf("Hello World!/n");
 return 0;
}


3. 在$(YOUR_ANDROID)/development/hello/目錄編寫Android.mk文件。這是Android Makefile的標準命名,不要更改。
Android.mk文件的格式和內容可以參考其他已有的Android.mk文件的寫法,針對 helloworld程序的Android.mk文件內容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
hello.c

LOCAL_MODULE := helloworld
include $(BUILD_EXECUTABLE)

注意上面LOCAL_SRC_FILES用來指定源文件;
LOCAL_MODULE指定要編譯的模塊的名字,下一步驟編譯時就要用到;
include $(BUILD_EXECUTABLE)表示要編譯成一個可執行文件,
如果想編譯成動態庫則可用 BUILD_SHARED_LIBRARY,
這些可以在$(YOUR_ANDROID)/build/core/config.mk查到。


4. 回到Android源代碼頂層目錄進行編譯:
# cd $(YOUR_ANDROID) && make helloworld
注意make helloworld中的目標名helloworld就是上面Android.mk文件中由LOCAL_MODULE指定的模塊名。編譯結果如下:

target thumb C: helloworld <= development/hello/hello.c
target Executable: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld)
target Non-prelinked: helloworld (out/target/product/generic/symbols/system/bin/helloworld)
target Strip: helloworld (out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld)
Install: out/target/product/generic/system/bin/helloworld


5.如上面的編譯結果所示,編譯後的可執行文件存放在out/target/product/generic/system/bin/helloworld,
   通過”adb push”將它傳送到模擬器上,再通過”adb shell”登錄到模擬器終端,就可以執行了


===================================================================
Android編譯完成後,將在根目錄中生成一個out文件夾,所有生成的內容均放置在這個文件夾中。out文件夾如下所示:
  out/
  -- CaseCheck.txt
  -- casecheck.txt
  -- host
    -- common
    -- linux-x86
  -- target
    -- common
    -- product
  主要的兩個目錄爲host和target,前者表示在主機(x86)生成的工具,後者表示目標機(默認爲ARMv5)運行的內容。
  host目錄的結構如下所示:
  out/host/
     -- common
        -- obj (JAVA庫)
     -- linux-x86
        -- bin (二進制程序)
        -- framework (JAVA庫,*.jar文件)
        -- lib (共享庫*.so)
        -- obj (中間生成的目標文件)
  host目錄是一些在主機上用的工具,有一些是二進制程序,有一些是JAVA的程序。
  target目錄的結構如下所示:
  out/target/
  -- common
  -- R (資源文件)
  -- docs
  -- obj (目標文件)
  -- product
     -- generic
  其中common目錄表示通用的內容,product中則是針對產品的內容。
  在common目錄的obj中,包含兩個主要的目錄:
  APPS 中包含了JAVA使用程序生成的目標,每個使用程序對應其中一個子目錄,將結合每個使用程序的原始文件生成Android使用程序的APK包。
  JAVA_LIBRARIES 中包含了JAVA的庫,每個庫對應其中一個子目錄。
  在默認的情況下,Android編譯將生成generic目錄,如果選定產品還可以生成其他的目錄。generic包含了以下內容:
  out/target/product/generic/
  -- android-info.txt
  -- clean_steps.mk
  -- data
  -- obj
  -- ramdisk.img
  -- root
  -- symbols
  -- system
  -- system.img
  -- userdata-qemu.img
  -- userdata.img
  在generic/obj/APPS目錄中包含了各種JAVA使用,與common/APPS相對應,但是已經打成了APK包。
  system目錄是主要的文件系統,

      data目錄是存放數據的文件系統。
  obj/SHARED_LIBRARIES中存放所有動態庫。
  obj/STATIC_LIBRARIES中存放所有靜態庫。
  多個以img爲結尾的文件是多個目標映像文件,其中ramdisk是作爲內存盤的根文件系統映像,system.img是主要文件系統的映像,這是一個比較大的文件,data.img是數據內容映像。這多個image文件是模擬器運行時真實需要的文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章