項目的源碼在這裡:
http://code.google.com/p/flying-on-android/
因為用到了dlopen等函數,所以,編譯ToolLibrary時,需要給LOCAL_SHARED_LIBRARIES加上libdl。
調用目前的目錄的子目錄下面的Android.mk時,寫法如下:
include $(LOCAL_PATH)/lib/Android.mk
如果像下面這樣寫的話
include lib/Android.mk
實際搜尋目錄是/lib/Android.mk
dlsym通過名字來定位方法,所以,方法不能重載。
dlopen也可以傳入路徑,如:/system/lib/libflying_display.so
編譯出來的.so庫被安裝到/system/lib目錄下:
LOCAL_MODULE_PATH:= $(TARGET_OUT_SHARED_LIBRARIES)
如果想安裝到/system/lib/hw下面的話,就這樣寫:
LOCAL_MODULE_PATH:= $(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_SHARED_LIBRARIES和LOCAL_LDLIBS是什麼關係?
前者的話,編譯時間需要檢測動態庫是否需要重新編譯,後者不需要。
在源碼中使用libskia.so的話,要這樣寫:
LOCAL_SHARED_LIBRARIES = libskia
在NDK使用的話,要這樣寫:
LOCAL_LDLIBS = -lskia
在源碼中,LOCAL_LDLIBS適用於HOST SHARED LIBS(不需要檢測動態庫源檔案是否改變),而LOCAL_SHARED_LIBRARIES適用於TARGET SHARED LIBS(需要檢測)
在源碼中編譯flying中的ToolLibrary時,需要連結libdl.so庫,有兩種寫法:
LOCAL_SHARED_LIBRARIES := libdl
LOCAL_LDLIBS += -ldl
第一種可以編譯通過,第二種編譯失敗,說找不到dlopen等的定義。
是因為libdl.so也屬於TARGET SHARED LIBS。它的源碼位於/bionic/libdl/目錄下。
關於host library和target library可以參考這裡:
The host library and target library
http://osr507doc.sco.com/en/tools/ShLib_Implement_Host.Target.html
關於LOCAL_PRELINK_MODULE,可以參考這裡:
Android編譯系統——續
http://blog.csdn.net/a345017062/archive/2011/05/24/6442325.aspx
關於dlopen dlsym dlclose等函數,可以參考這裡:
dlopen dlsym dlclose解析
http://blog.csdn.net/yujixi123/archive/2010/07/28/5772117.aspx
只是有一個地方需要注意,如果源碼是.cpp檔案話,一定要加上
extern "C" {
}
否則的話,會出現dlopen成功,但是用dlsym找不到符號的問題。
因為系統很可能會使用g++編譯器來編譯.cpp檔案,編譯出來的符號名不是C風格的,所以就找不到了。
可以參考這裡:
gcc與g++測試
http://blog.csdn.net/a345017062/archive/2011/05/31/6457761.aspx
只要在ToolLibrary.cpp檔案的開頭寫一個這樣的宏定義:
#define LOG_TAG "ToolLibrary"
那麼ToolLibrary.cpp檔案中使用LOGW("abc");進行列印時,列印出來的就是這樣的LOG了:
W/ToolDisplay( 2176): Hello ToolLibrary!
不要管編譯時間出現的警告:
warning: this is the location of the previous definition