2011-11-02 110 views
2

我正在將爲Linux編寫的3G調制解調器移植到帶ARM處理器的嵌入式Android(薑餅)設備。我已經將設備驅動程序(C代碼)編譯爲模塊(.ko文件)並安裝。我在啓動內核時看到它並運行良好。它按預期連接到USB端口。很高興能夠與之交談。將Linux驅動程序遷移到Android

下一個需要的部分是用C++編寫的「連接管理器」。這是我遇到問題的地方。這不會在內核空間中運行,但它不是具有用戶界面的常規Android應用程序。這是一個在後臺運行的「任務」,應該在啓動時從「init.rc」文件啓動。隨源代碼提供的makefile可以很好地設置依賴關係,但就我想要定位的平臺而言,它是無用的。我使用了用於編譯Android和內核的Android源代碼「arm-eabi- *」(運行在Unbuntu機器上)提供的工具鏈。我有很多編譯錯誤,因爲它使用了Android中不存在的標準「libc」庫。我用「bionic libc」取代了它,它是一款適用於android的linux libc的輕量級子集版本。最重要的是,它會查找「crt0.o」,它是啓動代碼,是Linux環境(和其他幾個操作系統)中靜態鏈接的程序。在Android中,它在運行時動態鏈接,因此使用的不是crt0.o.

在網絡上有很多關於Android應用程序編程的信息,但是對於那種低級別的東西來說很少。如果任何人有一個工作的makefile來構建這種C++代碼作爲Android ARM下的後臺任務運行,那麼我非常感謝您看看它,或者是否有任何信息可以幫助我找到解決辦法。或者如果有人做了這樣的事情可以給我一些關於如何實現這一目標的線索。

+0

Google有一個將一些C++代碼集成到APP(NDK)中的工具。它是Java和C++代碼之間的橋樑。我可以找到的文檔非常多,包括應用程序和用戶界面。我不確定它適用於我想要執行的操作,因爲它生成了一些由java代碼使用的庫。在Android文件夾「external /」中,我發現了一些有趣的C++源代碼,用於管理來自多個製造商的不同事物。它似乎是由基於「android.mk」文件的不同構建系統構建的。我將把我的代碼放在那裏,並以此爲例,看看我從中得到了什麼。任何人都知道更多? –

+0

在「build/core」中找到更多文檔它以build-system.html和ANDROID-MK.html開頭。 IT不完整且不是最新的,但這是一個起點 –

+0

HTML文檔已過時。但是,如果您從項目主文件夾中的「Makefile」開始,它會將您引導至Android構建系統所使用的makefile鏈,這與Linux構建系統完全不同。在那些makefile中,有很多評論描述什麼是什麼。我發現我想要做的不是通過NDK完成,而是將其作爲android本身的一部分。 –

回答

1

差不多一年後,但這裏是一個makefile,將編譯一個簡單的本機應用程序:

NDK_USR_PATH := $(NDK_USR) 

C_FILES := $(wildcard *.c) $(wildcard *.cpp) 
O_FILES := $(patsubst %.cpp,%.o,$(C_FILES)) 
O_FILES := $(patsubst %.c,%.o,$(C_FILES)) 

out: $(O_FILES) 
     @arm-eabi-gcc -o [email protected] $< -Bdynamic -Wl,--gc-section -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,--dynamic-linker=/system/bin/linker -Wl,-rpath-link=$(NDK_USR_PATH)/lib -nostdlib $(NDK_USR_PATH)/lib/crtend_android.o $(NDK_USR_PATH)/lib/crtbegin_dynamic.o -L$(NDK_USR_PATH)/lib -lc 

%.o: %.c 
     @arm-eabi-gcc -o [email protected] $< -c -I$(NDK_USR_PATH)/include -fno-short-enums 

clean: 
     @rm -f *.o 
     @rm -f out 

它編譯在同一個目錄中的任何.c文件到一個名爲「走出去」的應用程序。它需要環境變量NDK_USR指向ndk目錄「ndk/android-ndk-r7/platforms/android-14/arch-arm/usr /」。

這應該動態鏈接到仿生libc,並應該啓用android驅動程序開發。

複製並粘貼上述makefile時要小心。 Make對製表符非常具體。

+0

謝謝安德烈斯。我將使用該技巧爲android編譯C。在我的Cell調制解調器的情況下,我真正的問題是在Android和Linux中低層接口層(RIL)和操作系統的上層是不同的。所以,Porting比重新編譯代碼差得多。 –