android編譯庫
A. 6.2、Android Studio 添加編譯依賴
文章摘要
1、 三種依賴類型
2、庫依賴關系配置
3、遠程倉庫
4、查看依賴關系樹
英文文獻
Android Studio中的搖籃構建系統可以很容易地包括外部的二進制文件或其他庫模塊到您的構建與依賴。該依賴性可以位於您的計算機上或遠程倉庫中,他們宣布任何傳遞依賴將自動包括在內。
要添加一個依賴於你的項目,指定諸如依賴配置compile在dependencies您的塊build.gradle文件。
例如,下面build.gradle為應用模塊文件包括三種不同類型的依賴關系:
每個這些要求不同類型的依賴關系如下:
此聲明一有依賴性 的Android庫模塊 名為「在MyLibrary」(此名稱必須定義為庫名稱相匹配include你的 settings.gradle 文件)。它需要構建系統編譯庫模塊與應用模塊,並在您的APK所產生的AAR文件。
由於Gradle讀取相對路徑的build.gradle 文件,這告訴構建系統添加您的項目內的所有JAR文件 mole_name/libs/的目錄的依賴。
或者,您可以指定單獨的文件如下:
這實際上是以下簡寫:
這宣告了「應用程序魔」庫的12.3版本的依賴,在「code.example.android」命名空間組內。
內側dependencies塊,可以聲明使用幾種不同的一個庫依賴依賴關系配置(諸如compile上面示出)。每個相關配置提供了搖籃有關如何使用圖書館不同的指令。下面的列表描述了每個可使用在你的Android項目庫依賴的配置。
以上配置適用於項目的主要來源集,它適用於所有的構建變種。
如果你不是想聲明的依賴只有特定的 構建變數 源設置或更改一個 測試源設置 ,你必須利用配置名稱以及與構建變數或測試源集的名稱前綴它。
例如,在添加compile
依賴關系只為您的「免費」產品的風味(使用遠程二進制依賴),它看起來像這樣:
但是,如果你想添加一個依賴於結合了產品的風味變體和構建類型,那麼你必須初始化的配置名稱configurations塊。下面的示例增加了一個apk依賴於你的「freeDebug」打造變種(使用本地二進制依賴):
要添加compile為本地測試和儀表測試的依賴性,它看起來像這樣:
如果你的 庫模塊提供了多個變種 ,你可以添加不同的庫變體像這樣不同的應用程序變數:
當你的依賴比當地的圖書館或文件樹以外的東西,搖籃會在哪個在線存儲庫中指定的文件 repositories的塊build.gradle文件。
默認情況下,新的Android Studio項目申報JCenter作為該項目的頂級存儲庫位置build.gradle的文件,如下圖所示:
如果你想從Maven的中央倉庫的東西,然後再添加 mavenCentral(),或本地存儲庫使用mavenLocal():
參考配置:
有些直接依賴可能有自己的依賴。這些被稱為 傳遞依賴 。而不是要求您手動聲明每個傳遞依賴,搖籃自動收集,並增加了它們。為了形象化兩個項目的直接和傳遞依賴,對於搖籃的Android插件提供了生成依賴關系樹為每個搖籃任務 構建變數 和 測試源集合 。
要生成此報告,步驟如下:
下面的示例報告顯示調試構建變數的依賴關系樹,包括前面例子中的本地庫模塊依賴和遠程依賴性。
B. Android.mk介紹(一)
在linux下,可以通過Makefile來對源碼工程進行管理,Android.mk文件是Makefile的一小部分,它用來對Android程序進行編譯。Android.mk文件中描述了哪些C文件將被編譯且指明了如何編譯。Android.mk文件用來告知NDK Build 系統關於Source的信息。
1、編譯可執行程序
2、編譯動態庫或靜態庫
3、預編譯文件(APK或java庫)
以上三種是Android.mk的主要用法,我們寫mk文件時也就是以上三種目的。
首先看一個最簡單的Android.mk的例子:
講解:
每個Android.mk文件必須以定義 LOCAL_PATH 為開始。它用於在開發tree中查找源文件。
宏 my-dir 由Build System提供。返回包含Android.mk的目錄路徑。
CLEAR_VARS 變數由Build System提供。並指向一個指定的GNU Makefile,由它負責清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理 LOCAL_PATH .
這個清理動作是必須的,因為所有的編譯控制文件由同一個GNU Make解析和執行,其變數是全局的。所以清理後才能避免相互影響。
LOCAL_MODULE 模塊必須定義,以表示Android.mk中的每一個模塊。名字必須唯一且不包含空格。
Build System會自動添加適當的前綴和後綴。例如,foo,要產生動態庫,則生成libfoo.so.
但請注意:如果模塊名被定為:libfoo.則生成libfoo.so. 不再加前綴。
LOCAL_SRC_FILES變數必須包含將要打包如模塊的C/C++ 源碼。
不必列出頭文件,build System 會自動幫我們找出依賴文件。
預設的C++源碼的擴展名為.cpp. 也可以修改,通過LOCAL_CPP_EXTENSION。
BUILD_SHARED_LIBRARY:是Build System提供的一個變數,指向一個GNU Makefile Script。
它負責收集自從上次調用include $(CLEAR_VARS) 後的所有LOCAL_XXX信息。並決定編譯為什麼。
BUILD_STATIC_LIBRARY:編譯為靜態庫。
BUILD_SHARED_LIBRARY :編譯為動態庫
BUILD_EXECUTABLE:編譯為Native C可執行程序
BUILD_PACKAGE(既可以編apk,也可以編資源包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true)
BUILD_JAVA_LIBRARY(Java共享庫)
BUILD_STATIC_JAVA_LIBRARY(java靜態庫)
Android源碼中有大量的mk文件,Android系統的編譯就是靠著這些mk文件的,所以學好是非常有必要的哦!
C. android 編譯好的ndk庫應該放在哪個目錄
可以使用的。 解析:首先Android就是Linux內核。 android應用程序開發環境: 包括eclipse、java、 android sdk、 adt等。 安裝android-ndk開發包,這個開發包可以在google android 官網下載: 通過這個開發包的工具才能將android jni 的C/C++的代碼編譯成庫 android的NDK開發需要在linux下進行: 因為需要把C/C++編寫的代碼生成能在arm上運行的.so文件,這就需要用到交叉編譯環境,而交叉編譯需要在linux系統下才能完成。 備註:NDK編譯步驟: 1.選擇 ndk 自帶的例子 hello-jni ,位於E:\android-ndk-r5\samples\hello-jni( 根據具體的安裝位置而定 ) 。 2.運行 cygwin ,輸入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,進入到 E:\android-ndk-r5\samples\hello-jni 目錄。 3.輸入 $NDK/ndk-build ,執行成功後,它會自動生成一個 libs 目錄,把編譯生成的 .so 文件放在裡面。 ($NDK是調用我們之前配置好的環境變數, ndk-build 是調用 ndk 的編譯程序 ) 4.此時去 hello-jni 的 libs 目錄下看有沒有生成的 .so 文件,如果有,ndk 就運行正常了。
D. 如何在Android設備中用NDK編譯SQLite並且對SQLite進行操作
SQLite是輕量級嵌入式資料庫引擎,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。此外它還是開源的,任何人都可以使用它。許多開源項目((Mozilla, PHP, Python)都使用了 SQLiteSQLite 由以下幾個組件組成:SQL 編譯器、內核、後端以及附件。SQLite 通過利用虛擬機和虛擬資料庫引擎
(VDBE),使調試、修改和擴展 SQLite 的內核變得更加方便。
1. Android 集成了 SQLite 資料庫 Android 在運行時(run-time)集成了 SQLite,所以每個 Android 應用程序都可以使用 SQLite 資料庫。
2. 資料庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開發中使用 SQLite 資料庫 Activites 可以通過 Content Provider 或者 Service 訪問一個資料庫。
3. Android 提供了 SQLiteOpenHelper 創建一個資料庫,只要繼承 SQLiteOpenHelper 類,就可以輕松的創建資料庫。SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。
4. SQLiteOpenHelper 的子類,至少需要實現三個方法:
構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的資料庫模型版本的整數。
2.onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。
3.onUpgrage() 方法,它需要三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
E. Android NDK編譯如何強制使用libc++.a的靜態鏈接庫
在編譯命令行中,將使用的靜態庫文件放在源文件後面就可以了。比如: gcc -L/usr/lib myprop.c libtest.a libX11.a libpthread.a -o myprop 其中-L/usr/lib指定庫文件的查找路徑,編譯器默認在當前目錄下先查找指定的庫文件。
F. 請教如何在android 系統下交叉編譯curl庫
你怎麼編譯的, cocos2dx的android.mk不能直接編譯, 要編譯主工程時包含編譯. 可以參考tests\proj.android\build_native.sh文件, 把裡面的幾個環境變數還成你自己的路徑再運行即可. 你的主工程的jni目錄下的android.mk和application.mk也要參考tests\proj.android\jni裡面的對應文件, 主要就是加入cocos2d-x幾個工程的依賴.
G. Android常見的預編譯(prebuilt)
android常用的預編譯方法(prebuilt)
1.framework引入靜態jar包
2.編譯共享jar包
3.編譯so庫
方法1 : 單獨編譯
方法2 : 輪詢編譯
4.預編譯apk
預置apk至系統,如果apk含有so庫的話,也需要提前編譯到系統中,解壓apk文件,將so提取出來放置某一文件夾中,通過LOCAL_PREBUILT_JNI_LIBS將so編譯至system/app/package/lib/arm目錄
H. 怎麼重新編譯android 下面的動態庫
使用動態庫來編譯動態庫
A項目的android.mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testa
LOCAL_SRC_FILES := testa.c
include $(BUILD_SHARED_LIBRARY)
生成的libtesta.so加入到E:\workspace\android-ndk-r8e\platforms\android-8\arch-arm\usr\lib\下面
項目B的文件目錄結構如下:
jni
jni/jni/
jni/prebuilt/
jni目錄下的mk文件如下:
include $(all-subdir-makefiles)
jni/prebuilt目錄下的mk文件如下:
LOCAL_PATH := $(call my-dir)
#include $(CLEAR_VARS)
LOCAL_MODULE := libtesta
LOCAL_SRC_FILES := libtesta.so
include $(PREBUILT_SHARED_LIBRARY)
同時把libtesta.so也放入該目錄下.
jni/jni目錄下的mk文件內容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -ltesta
LOCAL_MODULE := testb
LOCAL_SRC_FILES := testb.c
include $(BUILD_SHARED_LIBRARY)
這樣生成libtestb.so文件, 同時eclipse在打包時會把libtesta.so, libtestb.so都加入到apk文件中,如果沒有prebuilt那一步,那麼在打包時會漏掉libtesta.so, 但編譯會通過,因為編譯讀取的是編譯系統的庫文件目錄(LOCAL_LDLIBS := -ltesta), 這點需要注意
java代碼:
System.loadLibrary("testa");
System.loadLibrary("testb");
注意先後關系