2013-12-13 118 views
1

我需要執行以下步驟:如何使用Android設備(ARM)的NDK編譯C代碼?

  • 寫一個簡單的計數器,它一直在C/C++
  • 編譯溢出後重置本身並推送這個代碼進入手機通過ADB
  • 來看,它作爲在後臺通過ADB外殼定期​​執行

如何使用NDK工具鏈編譯上述C代碼?我發現了幾個類似的鏈接,但他們都沒有提供簡單而完整的步驟。

如果有完整的步驟的鏈接請做參考我相同的。

編譯環境:Ubuntu的,應該編譯通過控制檯沒有任何IDE進行

回答

2

你說得對,我犯了一個錯誤,我什至沒有測試過,並給了我 同樣的錯誤,是由於「主」的入口點,因爲這沒有 改變,但我希望這對你有用。無論如何檢查符號表「nm」, 的實時執行「strace」,你甚至可以使用gdbserver。

#include <stdio.h> 
int main (int argc, char *argv[]) 
{ 
     printf ("hello world"); 
     return 0; 
} 


export NDK_ROOT=your_ndk_path 
export PATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin:$PATH 
export CC=arm-linux-androideabi-gcc 
export LD=arm-linux-androideabi-ld 
arm-linux-androideabi-gcc -I$NDK_ROOT/platforms/android-18/arch-arm/usr/include -Wl,-rpath-link=$NDK_ROOT/platforms/android-18/arch-arm/usr/lib -Wl,-L$NDK_ROOT/platforms/android-18/arch-arm/usr/lib -Wl,-lc -o test test.c 

If ld return with erros like "... ld: error: cannot open... : No such file or directory" 
try this for your losed files: 
ln -s $NDK_ROOT/platforms/android-18/arch-arm/usr/lib/crtend_android.o 
ln -s $NDK_ROOT/platforms/android-18/arch-arm/usr/lib/crtbegin_dynamic.o 
+0

謝謝!但是,請你幫我理解一下「無論如何檢查符號表」nm「,即時執行」strace「,你甚至可以使用gdbserver。」我之前沒有用過這些東西 –

+0

感謝您的答案,但是沒有正確的方法來解決這些鏈接:ln -s $ NDK_ROOT/platforms/android-18/arch-arm/usr/lib/crtend_android。 o ln -s $ NDK_ROOT/platforms/android-18/arch-arm/usr/lib/crtbegin_dynamic.o ..我們不需要-Wl,-rpath-link = $ NDK_ROOT/platforms/android-18 /拱臂/ usr/lib..is它在運行時? –

+0

那麼在使用bash的UNIX環境中,假設NDK_ROOT是一個變量,$ NDK_ROOT訪問它的值,我不知道爲什麼這不適合你。 -Wl將向編譯器指定「下一個選項」用於鏈接器。 –

1
I use gcc4.8 and android API-level18 
usin this you can try: 

First way using command line. 
export NDK_ROOT=your_ndk_path 
export PATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin:$PATH 
export CC=arm-linux-androideabi-gcc 
export LD=arm-linux-androideabi-ld 
export CPPFLAGS=-I$NDK_ROOT/platforms/android-18/arch-arm/usr/include 
export CFLAGS="-nostdlib" LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-18/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-18/arch-arm/usr/lib" 
export LIBS="-lc" 
arm-linux-androideabi-gcc -nostdlib -o test test.c 

If run "file test" you should see this: 
test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped 


Second way using autotools. 
export PATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin:$PATH 
./configure --host=arm-linux-androideabi CC=arm-linux-androideabi-gcc LD=arm-linux-androideabi-ld CPPFLAGS="-I$NDK_ROOT/platforms/android-18/arch-arm/usr/include" CFLAGS="-nostdlib" LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-18/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-18/arch-arm/usr/lib" LIBS="-lc" 
make 
http://embelinux.blogspot.com/2013/09/autotools1-hola-mundo-la-autotools.html 


Third way using android developers ndk full feature. 
Read Android.mk file syntax specification. This document describes the 
syntax of Android.mk build file written to describe your C and C++ source 
files to the Android NDK. 
http://www.kandroid.org/ndk/docs/ANDROID-MK.html 
+0

嗨,你能解釋一下CFLAGS和LDFLAGS..the編譯fails..if我包括 ..as它不從獲取平臺/頭。 。/ ...文件夾,而是在.../toolchain中找到一個.../include-fixed/stdio.h,其中還包含未找到的頭文件。另外,如果我不包含任何文件並編寫一個簡單的主要功能,它會編譯但在android上執行時會給出分段錯誤。 –

+0

我得到'test.c:1:19:致命錯誤:stdio.h:沒有這樣的文件或目錄 #include '這是什麼問題? – lukassz

1

gdbserver的是調試運行Android設備上的應用,並且可以從PC 控制GDB使用TCP連接。 gdb(GNU調試器) 需要調試符號。

當你編譯應用程序編譯器把定義的東西稱爲符號表 所有符號,這個問題並沒有鏈接到rtbegin_dynamic.o, crtend_android.o,如果你指定-nostdlib選項創建方案,但沒有工作(表辛博爾空) 納米(從目標文件列表的符號),如:納米測試

GCC是不是一個編譯器,它是控制的是其他應用程序是什麼使工作 爲執行 司機示例嘗試invoque編譯器使用 - ###作爲唯一選項以查看詳細信息

LDFLAGS:是國旗的鏈接

CFLAGS:是一個標誌編譯器(不是鏈接)

無論如何,如果你是新來的編輯,甚至在交強編譯 建議您使用Android .mk方式 對不起,我的英語;)

+0

感謝您的回覆,我是不是新的編譯,但是在Android設備上工作較少..並且,我不明白這部分..「問題不是鏈接到rtbegin_dynamic.o,crtend_android.o,如果您指定-nostdlib選項程序創建但是沒有工作(Table Simbol empty)nm(從目標文件中列出符號)例如:nm test「 –

+0

也可以理解,」invoque編譯器使用 - ###作爲唯一選項以查看詳細信息「 –

+0

從man gcc: - # ## 與-v一樣,除非命令未執行且參數被引用,除非它們僅包含字母數字字符或「./-_」。這對於s​​hell腳本來捕獲驅動程序生成的命令行很有用。 –

1
#Android.mk 
LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
#module name 
LOCAL_MODULE := test 
#src 
LOCAL_SRC_FILES := test.c 
#build executable 
include $(BUILD_EXECUTABLE) 

出口PATH = path_to_ndk_root:$ PATH

出口NDK_PROJECT_PATH =。

NDK-建立APP_BUILD_SCRIPT = Android.mk