Linux程式移植到Android上

2021-07-02 13:22:48 字數 1629 閱讀 4224

序言:由於本人還是比較偏重於先說明原理在說明實際操作步驟,要知其然更要知其所以然,如下圖所示:

一般情況下,有兩種方法。

1.乙個就是將程式靜態編譯,將程式中所有需要的庫全部編譯進可執行檔案中。這樣程式在android中執行就不需要鏈結任何動態庫了。但是帶來乙個非常大的弊端就是這個程式會非常大,資源利用會非常低下。乙個簡單的helloworld!都可以達到好幾百k!    

靜態編譯方法:

首先我們以移植乙個helloworld程式作為例子。

#include

void main()

printf("helloworld!\n");

輸入命令進行靜態編譯:arm-none-linux-gnueabi-gcc hello.c -static -o hello.out

然後利用adb push 將helllo.out放進android裝置的/system/bin目錄中,

用chmod 755 /system/bin/hello.out 更改其為執行許可權。

輸入: hello.out 即可看到螢幕上輸出helloworld!

如上說所一樣,這個hello.out程式有近650k,而且其使用的**不可重用。

2.另乙個就是用ld-llinux.so.3來替代android系統中/system/bin/linker來作為鏈結器進行動態鏈結,當然這就需要將相應的動態庫也拷貝到android中(個人理解,如果表述不夠準確請指正)。這樣就可以進行動態鏈結,並且正常執行了。

動態鏈結依舊按照上述helloworld程式作為例子。

編譯命令為:arm-none-linux-gnueabi-gcchello.c -ohello.out -wl,-dynamic-linker=/system/lib/ld-linux.so.3

這裡需要說明的是,這個/system/lib是指android手機中存放聯結器ld-linux.so.3的目錄。正式利用這個聯結器來替代android系統中/system/bin/linker才能動態鏈結執行程式。

可以看到libgcc_s.so.1和libc.so.6就是這個helloworld所需要的動態鏈結庫。

然後找到arm-none-linux-gnueabi-gcc的安裝目錄。如果你是解壓壓縮包配置path的安裝路徑的話,這些動態鏈結庫檔案就在./arm-none-linux-gnueabi/libc/armv4t/lib 下。

找到ld-linux.so.3和上述需要的動態鏈結庫,將他們cp 出來。

然後,利用adb push 將他們放入android系統的/system/lib目錄下,將hello.out放入到/system/bin下,更改hello.out和ld-linux.so.3的許可權為可執行即可(chmod 755 hello.out)。這裡需要說明一下,ld-linux.so.3作為他們的聯結器,一定需要可執行許可權,否則就會提示permission denied。

做好這些後,輸入hello.out 即可看到螢幕打出helloworld!

window程式移植到linux(二)

1.windows程式中檔案查詢函式 setcurrentdirectory函式 findfirstfile函式 getfullpathname函式 cstringlist cfilesearchengine searchfile cstring strpath,cstringlist listfi...

Windows 程式移植到Linux平台的一波N折

本人前端時間寫了個html檔案分析器,windows平台上的vc6.0,使用標準c 昨天接到指令,應要求要發布乙個linux版本的,茫然啦,linux下面的hello world都沒有玩過,對linux下的c 程式僅僅限於聽他們神吹過的gcc,g makefile什麼的,其他一概不知。這就注定移植過...

將 MFC 應用程式移植到 Linux

第一種方法 找乙個類似mfc框架的程式庫。您可能仍然在維護用微軟基礎類庫 microsoft foundation classes mfc 構建的舊的 windows 應用程式,而現在卻有客戶要求 linux 版本,該怎麼辦呢?在您的團隊中可能有技術熟練的 mfc 開發人員,但如何達到加速 linu...