我需要執行以下步驟:如何使用Android設備(ARM)的NDK編譯C代碼?
- 寫一個簡單的計數器,它一直在C/C++
- 編譯溢出後重置本身並推送這個代碼進入手機通過ADB
- 來看,它作爲在後臺通過ADB外殼定期執行
如何使用NDK工具鏈編譯上述C代碼?我發現了幾個類似的鏈接,但他們都沒有提供簡單而完整的步驟。
如果有完整的步驟的鏈接請做參考我相同的。
編譯環境:Ubuntu的,應該編譯通過控制檯沒有任何IDE進行
我需要執行以下步驟:如何使用Android設備(ARM)的NDK編譯C代碼?
如何使用NDK工具鏈編譯上述C代碼?我發現了幾個類似的鏈接,但他們都沒有提供簡單而完整的步驟。
如果有完整的步驟的鏈接請做參考我相同的。
編譯環境:Ubuntu的,應該編譯通過控制檯沒有任何IDE進行
你說得對,我犯了一個錯誤,我什至沒有測試過,並給了我 同樣的錯誤,是由於「主」的入口點,因爲這沒有 改變,但我希望這對你有用。無論如何檢查符號表「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
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
嗨,你能解釋一下CFLAGS和LDFLAGS..the編譯fails..if我包括
我得到'test.c:1:19:致命錯誤:stdio.h:沒有這樣的文件或目錄 #include
gdbserver的是調試運行Android設備上的應用,並且可以從PC 控制GDB使用TCP連接。 gdb(GNU調試器) 需要調試符號。
當你編譯應用程序編譯器把定義的東西稱爲符號表 所有符號,這個問題並沒有鏈接到rtbegin_dynamic.o, crtend_android.o,如果你指定-nostdlib選項創建方案,但沒有工作(表辛博爾空) 納米(從目標文件列表的符號),如:納米測試
GCC是不是一個編譯器,它是控制的是其他應用程序是什麼使工作 爲執行 司機示例嘗試invoque編譯器使用 - ###作爲唯一選項以查看詳細信息
LDFLAGS:是國旗的鏈接
CFLAGS:是一個標誌編譯器(不是鏈接)
無論如何,如果你是新來的編輯,甚至在交強編譯 建議您使用Android .mk方式 對不起,我的英語;)
感謝您的回覆,我是不是新的編譯,但是在Android設備上工作較少..並且,我不明白這部分..「問題不是鏈接到rtbegin_dynamic.o,crtend_android.o,如果您指定-nostdlib選項程序創建但是沒有工作(Table Simbol empty)nm(從目標文件中列出符號)例如:nm test「 –
也可以理解,」invoque編譯器使用 - ###作爲唯一選項以查看詳細信息「 –
從man gcc: - # ## 與-v一樣,除非命令未執行且參數被引用,除非它們僅包含字母數字字符或「./-_」。這對於shell腳本來捕獲驅動程序生成的命令行很有用。 –
#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
謝謝!但是,請你幫我理解一下「無論如何檢查符號表」nm「,即時執行」strace「,你甚至可以使用gdbserver。」我之前沒有用過這些東西 –
感謝您的答案,但是沒有正確的方法來解決這些鏈接: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它在運行時? –
那麼在使用bash的UNIX環境中,假設NDK_ROOT是一個變量,$ NDK_ROOT訪問它的值,我不知道爲什麼這不適合你。 -Wl將向編譯器指定「下一個選項」用於鏈接器。 –