自己動手編譯C程式並執行於Android系統

2021-08-28 10:56:34 字數 2295 閱讀 8727

搭建**架構

編譯執行

很多半路出家的安卓開發工程師並不了解怎麼樣在android studio上搭建交叉編譯環境;不過沒關係,不懂我們可以學習,了解底層的執行原理對於我們成為更為高階的工程師或者架構師很有幫助;

工欲善其事必先利其器,首先我們把環境搭建一下;

從androidstudio2.2版本開始,可以用cmake方式建立jni工程,到目前為止,大家基本都是用的2.2以上版本,所以這裡只講cmake做ndk開發;

開啟androidstudio之後按照以下步驟:

file-new-new project , 注意勾選支援c++。然後一路next一直到finish頁面。在最後的頁面需要選擇ndk的版本,還有其他的一些可選項,在這裡我只開發最簡單的helloworld c程式,所以我們選擇預設就好;

)pie這個安全機制從4.1引入,但是android l之前的系統版本並不會去檢驗可執行檔案是否基於pie編譯出的。因此不會報

error: only position independent executables (pie) are supported.

但是android l已經開啟驗證,如果呼叫的可執行檔案不是基於pie方式編譯的,則無法執行。解決辦法非常簡單,在android.mk中加入如下flag就行。

local_cflags

+=-pie -fpie

local_ldflags

+=-pie -fpie

:

= gnustl_static

確保ndk配置正確,注意觀察project下的local.properties檔案,我這裡是這樣的:

ndk.dir=

d\:\\android\\sdk\\ndk-bundle

sdk.dir=

d\:\\android\\sdk

修改project下的gradle.properties檔案,增加配置android.usedeprecatedndk=true,其作用在於告訴系統使用ndk編譯:

org.gradle.jvmargs=

-xmx1536m

android.usedeprecatedndk=

true

android

} sourcesets

}...

}

ndk的abifilters配置作用在於限定生成的cpu/abi。

jni.srcdirs = 表示禁止as自動ndk編譯,採用手動ndk-build。

jnilibs.srcdirs = [『src/main/libs』] 表示經過ndk-build編譯後的so路徑。

jni資料夾下新建cmd script,make_arm.cmd,用於手動ndk-build,內容如下(其實就是一句命令列操作執行ndk編譯):

然後我們可以在對應的目錄下看到我們編譯好的c程式可執行檔案,我們把這個檔案push到安卓裝置,並賦予可執行許可權:

靜態庫沒有.so副檔名

新增當前路徑為so庫檔案查詢路徑命令,防止elf檔案執行階段找不到so庫的問題,ld_library_path=$ld_library_path:/data/local/tmp

自己手寫WEB程式框架並執行

1 新建資料夾,起名myweb 2.資料夾下,新建兩個資料夾 web inf,meta inf,還可以新建一些jsp,html檔案 如 index.html 3在web inf中必須存在乙個檔案web.xml,還包含兩個資料夾 lib,classes 下面是要執行了 1,cmd 2,切換到myweb...

自己手寫WEB程式框架並執行

1 新建目錄,起名myweb 2.目錄下,新建兩個目錄 web inf,meta inf,還能夠新建一些jsp,html檔案 如 index.html 3在web inf中必須存在乙個檔案web.xml,還包括兩個目錄 lib,classes 以下是要執行了 1。cmd 2,切換到myweb的目錄。...

C程式編譯執行過程

c語言從源 到可執行檔案的過程 1 編譯預處理 讀取c源 對其中的偽指令 以 開頭的指令 和特殊符號進行處理 偽指令主要包括以下四個方面 1.1 巨集定義指令 define 定義巨集 undef 取消巨集的定義 預定義巨集 標準c中定義了一些物件巨集,這些巨集的名稱以 兩個下劃線 開頭和結尾,並且都...