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
Android並沒有採用glibc作為C庫,而是採用了Google自己開發的Bionic Libc,通用的Toolchain用來編譯和移植Android 的Linux核心是可行的,因為核心並不需要C庫,但是開發Android的應用程式時,其他Toolchain編譯的應用程式只能採用靜態編譯的方式才能執行,使用靜態方式編譯出來的執行檔案都比較大。[[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 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
【Android】android開發之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