⑴ 為什麼android.mk不走include$(build_prebuilt)
一、LOCAL_CFLAGS
LOCAL_CFLAGS-D,增加全局宏定義。
LOCAL_CFLAGS := -DUSE_JSC相當於在所有源文件中增加一個#define USE_JSC
LOCAL_CFLAGS := -DUSE_COPY_BIT=1相當於在所有源文件中增加一個#define USE_COPY_BIT 1
還有其它的像-W等,都是傳遞給編譯使用的。
比如:LOCAL_CFLAGS := Werror 就是傳給編譯使用
二、BUILD_PREBUILT
這種方式把文件當成編譯項目,在Android.mk中一個file
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) \
LOCAL_MODULE := usb_modeswitch.conf \
LOCAL_MODULE_CLASS := ETC \
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc \
LOCAL_SRC_FILES :=$(LOCAL_MODULE) \
include $(BUILD_PREBUILT)
上面的就是 usb_modeswitch.conf 文件到 OUT 下面的 etc目錄,這個目錄常用來存放配置相關文件。
上面所有的都說的是Copy File 但是如果需要 Copy 一個文件目錄下所有就需要另做操作了!
三、ACP
ACP描述的是一個Android專用的cp命令,在生成system.img鏡像文件的過程中是需要用到的。普通的cp命令在不同的平台(Mac OS X、MinGW/Cygwin和linux)的實現略有差異,並且可能會導致一些問題,於是Android編譯系統就重寫了自己的cp命令,使得它在不同平台下執行具有統一的行為,並且解決普通cp命令可能會出現的問題。例如,在Linux平台上,當我們把一個文件從NFS文件系統拷貝到本地文件系統時,普通的cp命令總是會認為在NFS文件系統上的文件比在本地文件系統上的文件要新,因為前者的時間戳精度是微秒,而後者的時間戳精度不是微秒。Android專用的cp命令源碼可以參考build/tools/acp目錄。
⑵ android ndk 怎樣調用第三方的so庫文件
問題描述:Android如何調用第三方SO庫;
已知條件:SO庫為Android版本連接庫(*.so文件),並提供了詳細的介面說明;
已了解解決方案:
1.將SO文件直接放到libs/armeabi下,然後代碼中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下來就可以直接調用xxx_xxx_xxx()方法;
2.第二種方案,創建自己的SO文件,在自己的SO文件里調用第三方SO,再在程序中調用自己的SO,這種比較復雜,需要建java類文件,生成.h文件,編寫C源文件include之前生成的.h文件並實現相應方法,最後用android NDK開發包中的ndk-build腳本生成對應的.so共享庫;
求解:
1.上面兩種方案是否可行?不可行的話存在什麼問題?
2.兩種方案有什麼區別?為什麼網上大部都是用的第二種方案?
3.只有一個*.so文件,並提供了詳細的介面說明,是否可在ANDROID中使用它?
首先要看這個SO是不是JNI規范的SO,比如有沒有返回JNI不直接支持的類型。也就是說這個SO是不是可以直接當作JNI來調用。如果答案是否定的,你只能選第二個方案。
如果答案是肯定的,還要看你是不是希望這個SO的庫直接暴露給JAVA層,如果答案是否定的,你只能選第二個方案,比如你本身也是一個庫的提供者。
一般如果你只有SO,就說明這個是別人提供給你的,你可以要求對方給你提供配套的JAVA調用文件。
1、這個要看這個SO是不是符合JNI調用的規范。還要看你自己的意願。
2、因為第二種方法最靈活,各種情況都可以實現。
3、可以
看能不能直接從JAVA調用的最簡單的方法就是看SO里的函數名是不是Java_XXX_XXX_XXX格式的
是就可以,你可以自己寫一個配套的JAVA文件,注意一下SO函數名和JAVA函數名的轉換規則,或者向SO提供方索要;
不是的話就選第二種方案吧。
1、檢查所需文件是否齊全
使用第三方動態庫,應該至少有2個文件,一個是動態庫(.so),另一個是包含
動態庫API聲明的頭文件(.h)
2、封裝原動態庫
原動態庫文件不包含jni介面需要的信息,所以我們需要對其進行封裝,所以我
們的需求是:將libadd.so 裡面的API封裝成帶jni介面的動態
3、編寫庫的封裝函數libaddjni.c
根據前面生成的com_android_libjni_LibJavaHeader.h 文件,編寫libaddjni.c,用
來生成libaddjni.so
Android中集成第三方軟體包(.jar, .so)
Android中可能會用到第三方的軟體包,這包括Java包.jar和Native包.so。jar包既可通過Eclipse開發環境集成,也可通過編譯源碼集成,看你的工作環境。
假定自己開發的程序為MyMaps,需要用到BaiMaps的庫,包括mapapi.jar和libBMapApiEngine_v1_3_1.so。
一、Eclipse中集成第三方jar包及.so動態庫
MyMaps工程下創建目錄libs以及libs/armeabi,把mapapi.jar放在的libs/目錄下,把libBMapApiEngine_v1_3_1.so放在libs/armeabi/下。
Eclipse中把第三方jar包mapapi.jar打包到MyMaps的步驟:
1. 右擊工程,選擇Properties;
2. Java Build Path,選擇Libraries;
3. Libraries頁面點擊右面按鈕「Add Library…」;
4. 選擇「User Library」,點擊「Next」;
5. 點擊「User Libraries」按鈕;
6. 在彈出界面中,點擊「New…」;
7. 輸入「User library name」,點擊「OK」確認;
8. 返回之後,選擇剛剛創建的User library,右面點擊「AddJARs」;
9. 選擇MyMaps/libs/下的mapapi.jar;
10. 確認,返回。
這樣,編譯之後,該jar包就會被打進MyMaps.apk中,libBMapApiEngine_v1_3_1.so也被打包在lib/armeabi/中。
程序運行過程中,libBMapApiEngine_v1_3_1.so被放在/data/data/<yourAppPackage>/lib/下,載入動態庫時系統會從程序的該lib/目錄下查找.so庫。
二、源碼中集成第三方集成jar包及.so動態庫
Android源碼中MyMaps放在packages/apps下。MyMaps下創建目錄libs以及libs/armeabi,並把mapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。
2.1 修改Android.mk文件
Android.mk文件如下:
[plain] view plain
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := libmapapi
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := MyMaps
include $(BUILD_PACKAGE)
##################################################
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libmapapi:libs/mapapi.jar
LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so
LOCAL_MODULE_TAGS := optional
include $(BUILD_MULTI_PREBUILT)
# Use the following include to make our testapk.
include $(callall-makefiles-under,$(LOCAL_PATH))
1 集成jar包
LOCAL_STATIC_JAVA_LIBRARIES取jar庫的別名,可以任意取值;
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES指定prebuiltjar庫的規則,格式:別名:jar文件路徑。注意:別名一定要與LOCAL_STATIC_JAVA_LIBRARIES里所取的別名一致,且不含.jar;jar文件路徑一定要是真實的存放第三方jar包的路徑。
編譯用BUILD_MULTI_PREBUILT。
2 集成.so動態庫
LOCAL_PREBUILT_LIBS指定prebuilt so的規則,格式:別名:so文件路徑。注意:別名一般不可改變,特別是第三方jar包使用.so庫的情況,且不含.so;so文件路徑一定要是真實的存放第三方so文件的路徑。
編譯拷貝用BUILD_MULTI_PREBUILT。
2.2 加入到GRANDFATHERED_USER_MODULES
在文件user_tags.mk中,把libBMapApiEngine_v1_3_1加入到GRANDFATHERED_USER_MODULES中
[plain] view plain
GRANDFATHERED_USER_MODULES += \
… \
libBMapApiEngine_v1_3_1
user_tags.mk可以是build/core下的,也可以是$(TARGET_DEVICE_DIR)下的,推薦修改$(TARGET_DEVICE_DIR)下的。
2.3 編譯結果
MyMaps.apk編譯生成在out/target/proct/<YourProct>/system/app/下;
libBMapApiEngine_v1_3_1.so放在out/target/proct/<YourProct>/system/lib/下,這也是系統載入動態庫時搜索的路徑。
⑶ Android.mk轉Android.bp
背景:
不少APP在P上是Android.mk,在10上變成Android.bp,我們在MK的時候需要對其進行轉換。
轉換方法虧伏:
利用Android自帶的工具進行轉換
使用自帶工具前提:
1.Source full build 過(最好)
2.在out/soong/咐絕host/linux-x86/bin/目錄下存在衡空姿androidmk文件。
如果不存在androidmk文件,使用m -j blueprint_tools命令生成
具體轉換方法:
1.cd out/soong/host/linux-x86/bin/
2.執行命令:androidmk <android.mk文件> > <android.bp文件>
例子:
1.cd out/soong/host/linux-x86/bin/
2.androidmk ./mk2bp/Android.mk > ./mk2bp/Android.bp
例子中step2說明:
由於out/soong/host/linux-x86/bin/路徑下文件太多,不好識別轉換後的文件,所以自己建了個mk2bp文件夾,放要轉換的Android.mk。方便查看而已
至於放Android.mk放哪,隨便。
如果遇到內容復雜一點的Android.mk,可能工具轉換會出錯。待進一步研究。
⑷ android源碼編譯,如何在/data目錄下創建文件夾導入文件。文件直接放out/target/././data目錄里好像沒用
您好,修改mk編譯的話是編譯不到data裡面去的。你可以在sh腳本裡面添加拷貝命令,在開機時候拷貝到data裡面。比如編譯後文件在system/etc/xxx.xx ,sh腳本就可以這么寫cp /system/etc/xxx.xx /data/etc/xxx.xx。