1. 程式人生 > >Android Native C 之 Helloworld的四種編譯方式

Android Native C 之 Helloworld的四種編譯方式

一.編寫helloworld.c Android.mk

    [[email protected] jni]# cat hello.c

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

}

    [[email protected] jni]# cat Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=hello.c
LOCAL_MODULE := helloworld
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)

二.編譯

    1) 使用NDK r5

          目錄結構  ─ hello
                                ├── jni
                                   ├── Android.mk

                                   └── hello.c

         [[email protected] nativity]# cd hello
         [[email protected] hello]# export NDK_PROJECT_PATH=`pwd`
         [
[email protected]
hello]# ndk-build Install : helloworld => libs/armeabi/helloworld [[email protected] hello]# adb push libs/armeabi/helloworld /data 44 KB/s (2176 bytes in 0.047s) [[email protected] hello]# adb shell / # cd /data /data # ls -l -rwxrwxrwx root root 2176 2011-08-07 03:01 helloworld /data # ./helloworld Hello World!

    2) 使用通用toolchain

        在hello.c目錄下
       [[email protected] jni]# arm-none-linux-gnueabi-gcc -static hello.c -o helloworld
       [[email protected] jni]# adb push helloworld  /data
       1718 KB/s (581219 bytes in 0.330s)
       [[email protected] jni]# adb shell
       / # cd /data
       /data # ls -l         
      -rwxrwxrwx root     root       581219 2011-08-07 03:28 helloworld
       /data # ./helloworld
       Hello World!

Windows: http://www.codesourcery.com/gnu_toolchains/arm/portal/package3400/public/arm-none-linux-gnueabi/arm-2008q3-41-arm-none-linux-gnueabi.exe
Linux: http://www.codesourcery.com/gnu_toolchains/arm/portal/package3399/public/arm-none-linux-gnueabi/arm-2008q3-41-arm-none-linux-gnueabi.bin

    3) 在原始碼環境中編譯

        1. 在原始碼development 目錄下建立hello目錄
       [[email protected] Android-2.3]# mkdir $Android_Src/development/hello
       2.將helloworld.c Android.mk拷貝至hello目錄下
       3. [[email protected] Android-2.3]# . build/envsetup.sh

       4. [[email protected] Android-2.3]# mmm development/hello/

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3.2
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GRH78C
============================================
make: 進入目錄“/opt/FriendlyARM/mini6410/android/Android-2.3”
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
make: 離開目錄“/opt/FriendlyARM/mini6410/android/Android-2.3” 
      5.編譯完成執行檔案在out/target/product/generic/symbols/system/bin/helloworld
        下載至裝置
       [[email protected] Android-2.3]# adb push out/target/product/generic/symbols/system/bin/helloworld  /data
       135 KB/s (7608 bytes in 0.054s)
       [[email protected] Android-2.3]# adb shell
       / # cd /data
       /data # ls -l    
       -rwxrwxrwx root     root         7608 2011-08-07 03:49 helloworld     
       /data # ./helloworld   
       Hello World!

    4) 使用原始碼自帶Toolchain

       在這之前要把上一步中的helloworld模組clean:
       [[email protected] Android-2.3]# make clean-helloworld
       使用showcommands選項重新編譯helloworld,檢視具體命令,從輸出命令列可以看到,Android編譯環境所用的交叉編譯工具鏈是prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc。
       [[email protected] Android-2.3]# make  helloworld  showcommands
       利用上面輸出的編譯命令,簡化來手工編譯helloworld程式,先手工刪除上次編譯得到的helloworld程式:
       [[email protected] Android-2.3]#  rm out/target/product/generic/system/bin/helloworld
       gcc編譯,生成目標檔案
       [[email protected] Android-2.3]# prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc  -I development/hello   -I out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates   -I dalvik/libnativehelper/include/nativehelper   -I system/core/include   -I hardware/libhardware/include   -I hardware/libhardware_legacy/include   -I hardware/ril/include   -I dalvik/libnativehelper/include   -I frameworks/base/include   -I frameworks/base/opengl/include   -I frameworks/base/native/include   -I external/skia/include   -I out/target/product/generic/obj/include   -I bionic/libc/arch-arm/include   -I bionic/libc/include   -I bionic/libstdc++/include   -I bionic/libc/kernel/common   -I bionic/libc/kernel/arch-arm   -I bionic/libm/include   -I bionic/libm/include/arch/arm   -I bionic/libthread_db/include  -c  -fno-exceptions -Wno-multichar -msoft-float -fpic -ffunction-sections -funwind-tables -fstack-protector -Wa,--noexecstack -Werror=format-security -fno-short-enums -march=armv5te -mtune=xscale -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -include system/core/include/arch/linux-arm/AndroidConfig.h -I system/core/include/arch/linux-arm/ -Wno-psabi -mthumb-interwork -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -DNDEBUG -g -Wstrict-aliasing=2 -finline-functions -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -DNDEBUG -UDEBUG -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64       -MD -o out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/hello.o development/hello/hello.c
       生成可執行檔案:
       [[email protected] Android-2.3]# prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-g++ -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -o out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/LINKED/helloworld -Lout/target/product/generic/obj/lib -Wl,-rpath-link=out/target/product/generic/obj/lib -lc -lstdc++ -lm  out/target/product/generic/obj/lib/crtbegin_dynamic.o         out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/hello.o        -Wl,-z,noexecstack    -Wl,--no-undefined  prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/../lib/gcc/arm-eabi/4.4.3/libgcc.a out/target/product/generic/obj/lib/crtend_android.o
       使用了out/host/linux-x86/bin/soslim工具進行STRIP
       [[email protected] Android-2.3]# out/host/linux-x86/bin/soslim --strip --shady --quiet out/target/product/generic/symbols/system/bin/helloworld --outfile out/target/product/generic/obj/EXECUTABLES/helloworld_intermediates/helloworld
[[email protected] Android-2.3]# adb push out/target/product/generic/symbols/system/bin/helloworld  /data
145 KB/s (7608 bytes in 0.051s)
[[email protected] Android-2.3]# adb shell
/ # cd /data/
/data # ls -l
-rwxrwxrwx root     root         7608 2011-08-07 04:14 helloworld
/data # ./helloworld
Hello World!
Android並沒有採用glibc作為C庫,而是採用了Google自己開發的Bionic Libc,通用的Toolchain用來編譯和移植Android 的Linux核心是可行的,因為核心並不需要C庫,但是開發Android的應用程式時,其他Toolchain編譯的應用程式只能採用靜態編譯的方式才能執行,使用靜態方式編譯出來的執行檔案都比較大。


相關推薦

Android Native C Helloworld編譯方式

一.編寫helloworld.c Android.mk     [[email protected] jni]# cat hello.c #include <stdio.h> int main() { printf("Hello World!

Android實現計算器佈局(佈局方式TableLayout表格佈局

表格佈局:tablelayout table佈局不支援跨行跨列,所以主要佈局的思想就是表格巢狀 效果 outline 之前一直到不知道怎麼用表格實現計算器的佈局,查資料的時候也一直在考慮跨行跨列來實現,網上說table佈局不

android開發筆記 Activity載入模式

既然是安卓開發,我們就免不了和Activity打交道,因為它是前臺的介面,也是android四大元件之一,那我們就來談談Activity的四種載入模式。 為什麼要為Activity指定載入模式? Android對Activity的管理,採用Task(即棧)來

android 四大元件Service兩呼叫方式使用詳解

一 概述 Service服務作為android中的四大元件之一,其作用和重要性也不用多說。service用於長期在後臺處理任務,與Activity相反Service沒有可見的使用者介面,但Service能長時間在後臺執行,Service是一個具有較長生命週期但沒有使用者介面

Android開發基本控制元件和詳解佈局方式

Android中的控制元件的使用方式和iOS中控制元件的使用方式基本相同,都是事件驅動。給控制元件新增事件也有介面回撥和委託代理的方式。今天這篇部落格就總結一下Android中常用的基本控制元件以及佈局方式。說到佈局方式Android和iOS還是區別挺大的,在iOS中有F

Android開發的基本控制元件和詳解佈局方式

Android中的控制元件的使用方式和iOS中控制元件的使用方式基本相同,都是事件驅動。給控制元件新增事件也有介面回撥和委託代理的方式。今天這篇部落格就總結一下Android中常用的基本控制元件以及佈局方式。說到佈局方式Android和iOS還是區別挺大的,在iOS中有Frame絕對佈局和AutoL

Androidandroid開發splash閃屏頁的實現方式,啟動頁的實現教程。

作者:程式設計師小冰,GitHub主頁:https://github.com/QQ986945193 首先給大家看一下今天實現的效果圖(其他三種都差不太多底下詳細介紹): 這個啟動頁實現的方法是四種,兩種是利用handler,其它兩種是利用了動畫的方式。 具體給大家貼一下

Android基礎Activity啟動模式和task相關

1 啟動模式介紹 啟動模式簡單地說就是Activity啟動時的策略,在AndroidManifest.xml中的標籤的android:launchMode屬性設定; 啟動模式有4種,分別為standard、singleTop、singleTask、singleI

MySQL系列隔離級別及加鎖

死鎖 開啟 serial 串行化 工作 保存 city innodb sele 事務 1、定義:所有操作必須成功完成,否則在每個操作中所作的所有更改都會備撤銷。 2、事務的ACID 原子性atomicity 一致性consistency 隔離性isola

linux c定時方式(sleep/usleep/select/ioctl)

test print types style color return epm open va_arg 1:sleep() 最小單位秒。使用sleep/ulseep/select時,因為線程會進入休眠狀態,再喚醒, 若單次執行問題不大,若是循環執行次數較多,則差別很大。 2

Android佈局方式

線性佈局 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orienta

Android 四大元件——Acitivity() Activity是如何載入顯示內容的?

1. 在Activity呼叫onCreate()等生命週期之前,Activity會呼叫attach()方法,而在attach()方法中會呼叫如下程式碼 onAttach() { PolicyManager.makeNewWindow(this) }而makeNewWindow實際

Android模擬點選的方式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android學習筆記——Activity的啟動模式

1.Activity的管理機制 Android的管理主要是通過Activity棧來進行的。當一個Activity啟動時,系統根據其配置或呼叫的方式,將Activity壓入一個特定的棧中,系統處 於執行(Running or Resumed)狀態。當按Back鍵或觸發finish(

javascript函式的呼叫方式

 函式的四種呼叫方式如下: (1)函式呼叫模式 (2)方法呼叫模式 (3)構造器模式 (4)上下文模式 1. 函式呼叫 模式 要呼叫,就肯定要先定義,函式的定義方式: 宣告式: function fuc() {} 表示式式: var func = function() {}; Fu

C || 圖的儲存結構實現

1. 陣列表示法: #include <stdio.h> #include <limits.h> #define INFINITY INT_MAX #define Maxvex 100 typedef struct graph {

Java多執行緒實現方式

介紹 繼承Thread類,並重寫其run方法 實現Runnable介面 實現Callable介面通過FutureTask包裝器來建立Thread執行緒 執行緒池,使用ExecutorService、Callable、Future實現有返回結果的多執行緒。 其

Java設計模式Singleton——不同的單例模式(Singleton)

單例模式(Singleton [?sglt?n]) 如果要保證系統裡最多隻能存在一個例項時,我們就需要單例模式。例如快取池、資料庫連線池等。 例項一:最簡單的單例模式 因為JVM在載入類時,對於static屬性的初始化只能由一個執行緒執行且僅執行一次,並且return操

面試裝逼必備mysql引擎

前言 資料庫儲存引擎是資料庫底層軟體組織,資料庫管理系統(DBMS)使用資料引擎進行建立、查詢、更新和刪除資料。不同的儲存引擎提供不同的儲存機制、索引技巧、鎖定水平等功能,使用不同的儲存引擎,還可以 獲得特定的功能。現在許多不同的資料庫管理系統都支援多種不同的資料引擎。MySql的核心就是儲存引擎

斐波那契數列的實現方式C語言)

斐波那契數列是一組第一位和第二位為1,從第三位開始,後一位是前兩位和的一組遞增數列, 像這樣的:1、1、2、3、5、8、13、21、34、55… 今天,我們用四種方式來進行實現: 1.遞迴 int Fibon1(int n) { if (n == 1 || n