標籤:android style blog http java color
Android中整合第三方庫的方法和問題
聲明:
1. 本文參考了網上同學們的現有成果,在此表示感謝,參考資料在文後有連結。
2. 本文的重點在第三部分,是在開發中遇到的問題及解決辦法.第一,第二部分為參考網上同學們的成果加以整理而成。
3. 歡迎轉載,交流,請尊重作者勞動成果;轉載請註明出處,謝謝!
Android中使用第三方庫可能有兩種:Java庫.jar和原生庫.so/.a,如果只是做上層APK開發,這兩種庫都可以通過Eclipse整合式開發環境進行整合,如果是平台級開發,則都可通過源碼整合。本文整理這兩種整合方式使用步驟,以下假設程式scanerapp,整合Java庫scanerjar.jar,原生庫libscanerbase.so/libscanerbase.a,libscanerplus.so/libscanerplus。其中,so庫要盡量參照Android引用庫規範編寫,內建函式命名也要規範(儘管不規範也可能可以使用),.a庫為靜態聯編,一般面向C/C++引用使用,如果Java上層使用,一般需要通過動態庫(.so)轉接。
一、Eclipse整合
1、scanerjar.jar包整合
A.當前工程scanerapp下建立libs目錄
B.使用Eclipse匯入scanerjar.jar包即可
2、libscanerbase.so和libscanerplus.so整合
A.當前工程scanerapp下建立libs/armeabi目錄
B.把libscanerbase.so和libscanerplus庫檔案拷貝到libs/armeabi目錄下即可,因為libscanerbase.so和libscanerplus.so庫為原生庫,一般做運行時載入的動態庫。
C.Java檔案引用載入庫
最終產生的apk會自動把libscanerjar.jar和libscanerbase.so和libscanerplus.so檔案打包進去。
二、源碼整合
源碼整合第三方庫也至少有兩種方式:C/C++連結方式和Android Prebuild方式,當然似乎前者無法整合libscanerjar.jar包。C/C++方式
1、C/C++連結方式
靜態庫和動態庫一般放置在libs/armeabi目錄下,如果庫檔案較多,也可以單獨另立目錄存放,只要對應修改庫檔案路徑(搜尋路徑即可)。
修改Android.mk檔案,樣本連結libscanerbase.a靜態庫:
LOCAL_LDFLAGS := $(LOCAL_PATH)/libs/armeabi/libbase.a
2、Android Prebuild方式
1) libscanerbase.jar包整合
A.在packages/app/scanerapp下建立libs目錄,這裡假設程式包放在packages/app下面。
B.把scanerbase.jar包拷貝到該目錄下
C.修改Android.mk檔案,樣本如下:
include $(CLEAR_VARS)LOCAL_STATIC_JAVA_LIBRARIES := scanerjarLOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=scanerjar:libs/libscaner.jarinclude $(BUILD_MULTI_PREBUILT)
其中,
LOCAL_STATIC_JAVA_LIBRARIES為引用jar庫的別名,可以隨便取名,一般就是用庫名稱就可以了。
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES為指定prebuilt java庫規則,格式為:別名:jar檔案的完整路徑,這裡的別名就是LOCAL_STATIC_JAVA_LIBRARIES所取的名字。
源碼開發時,scanerapp.apk將會連同libscaner.jar打包,一起放在out/target/product/<prjname>/system/app/目錄下;
2) libscanerbase.so和libscanerplus.so整合
A.在packages/app/scanerapp下建立libs/armeabi目錄
B.把.so庫拷貝到libs/armeabi目錄下
C.修改Android.mk設定檔,添加如下:
include $(CLEAR_VARS)LOCAL_STATIC_LIBRARIES := libscanersoLOCAL_PREBUILT_LIBS := libscanerso:libs/armeabi/libscanerbase.so libs/armeabi/libscanerplus.soinclude $(BUILD_MULTI_PREBUILT)
其中,
LOCAL_PREBUILT_LIBS指定prebuilt so庫規則,格式:別名:so檔案路徑。
源碼開發時,這個libscanerbase.so將會被放在out/target/product/<prjname>/system/lib/下,其中system/lib為載入動態庫時預設搜尋路徑。
此外,libscanerbase.so還可以整合到build/core/user_tags.mk中,不過一般不建議那麼做,我們應盡量減少修改系統級配置。
3) 源碼整合編譯
mmm /packages/apps/scanerapp
以上指令是在展訊ANDROID平台上使用,其它平台可能不同。
三、容易出現問題的點及解決辦法
1. 整合庫檔案到Eclipse項目
在將庫檔案添加到Eclipse項目中時,一定要注意添加庫的位置,不能放錯,否則不能被正常使用。Jar包放在libs/目錄下,so庫檔案一定要放在libs/armeabi目錄下。
2.整合庫檔案到源碼中
在源碼Integration Environment中(我們的平台為展訊平台),其他平台可以參考
(1) 在應用目錄(scanerapp)下的Android.mk檔案中,在引用多個庫的時候,庫檔案的別名可以不聲明,但是如果聲明了別名,就一定要注意該問題:別名後要將所有引用的庫都寫上,及一個別名後添加所有要引用的庫。
例如:
應寫成如下格式:
include $(CLEAR_VARS)LOCAL_STATIC_JAVA_LIBRARIES := scanerjarLOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=scanerjar:libs/libscaner.jar libs/libscanerplus.jar #問題點include $(BUILD_MULTI_PREBUILT)include $(CLEAR_VARS)LOCAL_STATIC_LIBRARIES := libscanersoLOCAL_PREBUILT_LIBS := libscanerso:libs/armeabi/libscanerbase.so libs/armeabi/libscanerplus.so #問題點include $(BUILD_MULTI_PREBUILT)
而不能寫成下面的格式:
include $(CLEAR_VARS)LOCAL_STATIC_JAVA_LIBRARIES := scanerjarLOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=scanerjar:libs/libscaner.jar scanerjar:libs/libscanerplus.jar #注意問題點include $(BUILD_MULTI_PREBUILT)include $(CLEAR_VARS)LOCAL_STATIC_LIBRARIES := libscanersoLOCAL_PREBUILT_LIBS := libscanerso:libs/armeabi/libscanerbase.so libscanerso:libs/armeabi/libscanerplus.so #注意問題點include $(BUILD_MULTI_PREBUILT)
(2) 在應用程式套件中有使用jni代碼的情況,在軟體包jni目錄下的(scanerapp/jni)Android.mk中要參考如下聲明方式:
include $(CLEAR_VARS)LOCAL_MODULE := libscanerjniLOCAL_SRC_FILES := scaner.cppLOCAL_LDLIBS := -llogLOCAL_MODULE_TAGS := optionalinclude $(BUILD_SHARED_LIBRARY)
其中,LOCAL_MODULE會被應用所使用,LOCAL_MODULE_TAGS一定要申明,否則編譯時間會報錯,不能進行編譯。
在應用(scanerapp)目錄下的Android.mk檔案中一定要聲明LOCAL_JNI_SHARED_LIBRARIES,樣本如下:
LOCAL_JNI_SHARED_LIBRARIES := libscanerjniLOCAL_PROGUARD_ENABLED := disabled
其中libscanerjni為應用(scanerapp/jni)目錄下Android.mk檔案中申明的Jni模組。
如果應用的包,在編譯時間提示proguard錯誤,則要將LOCAL_PROGUARD_ENABLED設定為disabled;
(3)按照該規則正確寫了Android.mk檔案,使用mmm單獨編譯scanerapp也能正常編譯通過,能夠正常看到提示已經將所用到的so庫檔案copy到out/…/system/libs目錄下。但是將整個項目全編時,卻發現out/…/system/libs目錄下並沒有我們所需要的.so庫檔案。出現這種情況,可進行如下操作,(展訊平台可照搬,其他平台可參考,思路是一樣的)
第一:將所要引用的so檔案拷貝到project/vendor/sprd/proprietaries/<projectName>/system/lib目錄下
第二:開啟project/device/sprd/<prjecetName>/proprietaries.mk
將索要引用的so庫檔案添加到PROPMODS項中。
第三:make –j4編譯項目
(完)
---------------------------
參考資料:
http://blog.csdn.net/thl789/article/details/7918093
http://www.zzqhost.com/?post=14
http://www.metsky.com/archives/635.html
----------------------------------
歡迎瀏覽、技術交流請尊重勞動成果轉載請註明出處,謝謝!http://blog.csdn.net/netwalk/article/details/24737241