Android工程文件夾中,我們可以通過jni機制來調(diào)用c/c++編寫的本地共享庫,例如libtest.so
在java文件中聲明一個靜態(tài)的調(diào)用,和共享庫中要調(diào)用的函數(shù)
test.java中
static{
system.loadlibrary("test");
}
static native int test(int i);
相應(yīng)在相關(guān)的c/c++ 文件中按照jni的編寫規(guī)則編寫即可,android自己增加了一個當loadlibrary時會調(diào)用jni_onload , jni_unload函數(shù),這個不是重點。
我要提供的是so文件交叉編譯的方法。
android提供了ndk及相關(guān)mk文件的寫法用來給編程人員編寫c/c++本地文件,但我看了一下并不習慣這種編譯方式,懶得去弄明白。所以決定還是按照原來的交叉編譯方式進行
1.首先在源碼中尋找/prebuild/linux-x86/tooltrain/arm-eabi-4.x.1/bin/這個目錄下的編譯文件,在~/.bashrc中將編譯使用的gcc, g++, ar等定義相應(yīng)變量cc,cpp,ar為arm編譯器,并在make file中使用相應(yīng)變量來編譯
2.在編譯so時要加上 -nostdlib 參數(shù),不然系統(tǒng)會去鏈接標準庫發(fā)生ld的錯誤
例如: $CPP -shared -nostdlib -fpic -o libtest.so -c test.o (test.c 生產(chǎn)test.o文件時需要-I 源碼中的dalvik/libnativehelper/include/nativehelper文件夾,不然會因缺少頭文件導(dǎo)致編譯失敗)
3.將生產(chǎn)的so文件拷貝到工程 /libs/armeabi/ 下,調(diào)用即可
解釋幾個基本概念:
1. 在linux中用ar -cvr -o libabcd.a ab.o cd.o 編譯會生成.a文件,這個稱為靜態(tài)庫或歸檔庫,可以在編譯的時候加入.a一起編譯,(gcc -o main main.o -L. -labcd)運行時程序會copy靜態(tài)庫中的代碼段。-L后面跟靜態(tài)庫所屬目錄,-l后為靜態(tài)庫名稱,系統(tǒng)會自動過濾掉lib 和.a
2. .so文件生成 gcc -shared -fpic -o libabcd.so libabcd.a
so文件為共享庫,相當于dll,在運行時要調(diào)用時才去加載共享庫中代碼 可執(zhí)行文件編譯方式與.a類似。
3.為什么要加入nostdlib,因為android沒有用linux的libc庫,而是使用自己的c函數(shù)庫
【本文標簽】: 多層 pcb 多層PCB面板 沉金板 公司設(shè)備
【責任編輯】:鼎紀電子PCB??? 版權(quán)所有:http://ai-hots.com/轉(zhuǎn)載請注明出處
掃一掃更精彩!
2001-2018 深圳鼎紀電子有限公司 版權(quán)所有
粵ICP備16081348號
全國服務(wù)熱線:0755-27586790
24小時銷售熱線:18025855806|18682125228
地址:深圳市寶安區(qū)西鄉(xiāng)黃崗嶺工業(yè)區(qū)灣區(qū)人工智能產(chǎn)業(yè)園B棟605
深圳鼎紀電子有限公司:單面PCB板