JNI在編譯時的原始檔和生成檔案的層次結構詳解

2021-07-22 21:06:12 字數 2376 閱讀 8089

之前如果你對jni還不是很了解,建議你去看一下我之前寫的兩篇有關jni的部落格,腦補一下jni。在這裡我當你是了解的。主要圍繞生成.so檔案時的相關檔案層次結構來介紹,當你把自己的程式的這方面的資料夾層次結構分析清楚了之後,你才會有進一步的提高。腳踏實地,一步一步來吧!

local_module_tags :=user eng tests optional

user:指該模組只在user版本下才編譯

eng:指該模組只在eng版本下才編譯

tests:指該模組只在tests版本下才編譯

optional:指該模組在所有版本下都編譯

local_cflags-d,增加全域性巨集定義。

local_cflags := -duse_jsc相當於在所有原始檔中增加乙個#define use_jsc

local_cflags := -duse_copy_bit=1相當於在所有原始檔中增加乙個#define use_copy_bit 1

還有其它的像-w等,都是傳遞給編譯使用的。

local_ldlibs :鏈結的庫不產生依賴關係,一般用於不需要重新編譯的庫,如庫不存在,則會報錯找不到。且貌似只能鏈結那些存在於系統目錄下本模組需要連線的庫。如果某乙個庫既有動態庫又有靜態庫,那麼在預設情況下是鏈結的動態庫而非靜態庫。

如:local_ldlibs += -lm –lz –lc -lcutils –lutils –llog …

local_ldflags:這個編譯變數傳遞給鏈結器乙個一些額外的引數,比如想傳遞而外的庫和庫路徑給ld,或者傳遞給ld linker的一些鏈結引數,-on,-el(大小端位元組序),那麼就要加到這個上面,如:

local_ldflags += -l$(local_path)/lib/ -lhwrecog –eb –o …

或者直接加上絕對路徑庫的全名:

local_ldflags += $(local_path)/lib/libhwrecog.a –eb –o

local_disable_format_string_checks := true本地禁用格式字串檢查

也許你可以不要把每個細節都弄明白,因為畢竟我們不是做正規開發類庫的。所以了解它是如何開發的就已經足夠了,起碼以後看到了,可以知道怎麼入手。

這裡主要說明一下,相關檔案的存放資料夾以及生成檔案的存放資料夾。

程式的目錄結果裡lib資料夾一般是存放一些類庫的可以使自動生成的(如果生成的檔案不在這個資料夾就需要拷到這個資料夾下),也可以是從別的地方引入的。lib資料夾下也是分好幾個資料夾的例如有 armeabi-v7a 和 armeabi(他們表示的是cpu的型別,所以相應的類庫放在相應的資料夾也是十分重要的。)

有乙個存放的底層檔案的資料夾,取名一般與jni相關或者與你的實現的功能相關,在該資料夾的裡面包括.c和.h檔案。一般來說他們是成對出現的。還有相關的android.mk檔案,用於對生成.so檔案進行配置。

obj資料夾,按照我的理解。一般在c語言編譯的時候,都會生成.obj檔案。所以這裡的obj資料夾應該是存放編譯時候的一下臨時檔案,如果類庫在重新編譯的遇到錯誤了,可以嘗試著將該資料夾清空之後在重新編譯一下,說不定就可以解決問題了。

libenc是jni編譯的主要檔案了,它包括jni、libs、obj三個資料夾:

jni資料夾裡面實現了兩個功能:一是編譯生成libx264.a靜態類庫(可以用於程式開發的編碼h.264的類庫),而是編譯生成libyuv.so動態類庫

jni下的lib是存放libx264.a和libyuv.so類庫的;libx264則是用於生成libx264.a所用到的全部底層檔案以及標頭檔案,libyuv資料夾也是一樣。

在生成好libx264.a和libyuv.so類庫後,我們android.mk是如下配置的

在這裡主要是編譯生成libenc.so檔案。但編譯這個需要引入libx264.a靜態類庫和libyuv.so動態庫,其他的設定在上面都有介紹。最在生成了libenc.so和libyuv.so動態庫(我看了大小沒有改變可能是設定的時候要求生成動態庫所以動態庫就被完整地儲存了下來,但是不是這樣我還不清楚。只是我的猜想)
libs資料夾是預設的存放生成的類庫資料夾,我所有生成的類庫都在這裡。當然需要用的時候拷貝到相應的資料夾就可以了。

obj檔案時存放一些編譯的時候存放的一下臨時檔案。

boost庫生成檔案命名和編譯

生成檔案命名規則 boost中有許多庫,有的庫需要編譯 而有的庫不需要編譯,只需包含標頭檔案就可以使用。編譯生成的檔案名字普遍較長,同乙個庫根據編譯鏈結選項不同,又可以生成多個不同名字的檔案。生成的檔案名字是很長,可是這樣帶的資訊才多,也就容易識別出用途。其實生成檔案的名字遵循一定的規則,有著固定的...

原始檔在編譯器中的處理過程

預處理 1.只進行預處理操作 gcc e demo.c demo2.i 大於號的作用是把進行預處理操作後生成的.i檔案放到大於號後面的檔案裡面,稱作重定向。經過預處理之後的檔案字尾名為.i 2.預處理做的事情包括 標頭檔案展開 巨集替換 條件編譯 條件編譯在實際應用中非常多,通過條件編譯可以選擇編譯...

除錯時原始檔與模組生成時的檔案不同

今天在弄原來那個傳送接收程式的時候遇到個問題 在visual studio 2008中做程式的時候,在設計器裡面新增了控制項,但是在執行除錯的 時候卻沒顯示,也沒看見有報錯,更改了那些控制項的屬性值之後也同樣在除錯的時候一點反 應沒有。在初始化元件那裡打個斷點監視,卻報錯 除錯時原始檔與模組生成時的...