(1)編寫動態庫源程序文件
這裏以my_add.c爲例。首先進入/home/android/development/,該目錄下創建文件夾
lib_test,更愛該目錄的權限後進入該目錄。依次執行
# cd /home/android/development
# mkdir lib_test
# chmod 777 ./lib_test
# cd ./lib_test
在lib_test下創建my_add.c源文件,如下。
/*
my_add.c
*/
#include <stdio.h>
int add(int x, int y)
{
int sum = x + y;
printf("The sum of %d and %d is %d\n", x, y, sum);
return sum;
}
該程序計算兩個整形變量的和並返回該值,同時打印求和信息。
(2)編寫Android.mk文件
在lib_test目錄下創建Android.mk文件,內容如下
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= my_add.c
LOCAL_MODULE:=libmy_add
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
(3)編譯動態庫
進入lib_test目錄,用mm命令編譯動態庫。
# cd /home/android/development/lib_test
# mm
編譯完成之後生成的動態庫文件明爲$(LOCAL_MODULE).so,即libmy_add.so。該動態
庫位於/home/android/out/target/product/generic/system/lib目錄下。
2.調用動態庫
(1)編寫調用動態庫的源程序
在刪除之前在lib_test目錄下的創建的my_add.c和Android.mk文件,並在該目錄下創
建libtest.c文件以及my_add.h文件,內容如下:
/*
libtest.c
*/
#include <stdio.h>
#include "my_add.h"
int main()
{
add(3,4);
printf("Done\n");
return 0;
}
my_add.h頭文件:
/*
my_add.h
*/
int add(int x, int y);
(2)編寫Android.mk文件
在lib_test目錄下創建Android.mk文件,內容如下。
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=libtest.c
LOCAL_MODULE:=lib_test
LOCAL_SHARED_LIBRARIES:=libmy_add
include $(BUILD_EXECUTABLE)
注:LOCAL_SHARED_LIBRARIES指明要調用的動態庫文件,這裏動態庫文件爲libmy_add.so,
位於/home/android/out/target/product/generic/lib目錄下,編譯時會自動在這個目錄
下尋找該動態庫文件。
(3)編譯
進入lib_test目錄,使用mm命令進行編譯。
# cd /home/android/development/lib_test
# mm
生成的可執行文件lib_test文件位於/home/android/out/target/product/generic/s
ystem/bin目錄下。
3.在Android模擬器中使用
(1)啓動模擬器
(2)運行程序
等待模擬器初始化完成後,將lib_test文件push進模擬器,並將libmy_add.so文件pu
sh至模擬器的system/lib目錄下。
由於模擬器下/system/目錄爲制度目錄,需修改權限,使用adb remount 命令。依次
執行:
#adb remount
# adb push /home/android/out/target/product/generic/system/lib/libmy_add.s
o /system/lib
# adb push /home/android/out/target/product/generic/system/bin/lib_test /d
ata
執行push命令之後登錄模擬器,在模擬器終端下調用lib_test執行。
# adb shell
#/data/lib_test
4.隱藏動態庫函數細節
可通過選項-fvisibility=hidden將動態庫中不必要暴露的函數和全局變量隱藏起來。
從而在調用動態庫的時候,只有不被隱藏(開放)的函數可以調用,其他函數和變量這部
能被調用(引用)。在Android.mk文件中的LOCAL_CFLAG中加入該選項即可,及
LOCAL_CFLAG += -fvisibility=hidden。
而要開放的函數前只需加上__attribute__ ((visibility ("default")))限定。
例如生成通過以下mylib.c生成動態庫libmylib.so,可編寫Android.mk文件爲:
#Android.mk file
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=\
mylib.c
LOCAL_MODULE:=libmylib
LOCAL_CFLAGS +=-fvisibility=hidden
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
/*
mylib.c
*/
#include <stdio.h>
__attribute__ ((visibility ("default"))) int add(int x, int y)
{
int sum = x + y;
printf("%d add %d is %d\n", x, y, sum);
return sum;
}
int sub(int x, int y)
{
int sub = x - y;
printf("%d sub %d is %d\n", x, y, sub);
return sub;
}
int mul(int x, int y)
{
int mul = x*y;
printf("%d multiply %d is %d\n", x, y, mul);
return mul;
}
這樣通過mm命令編譯生成的libmylib.so中只有函數int add(int x, int y)是可以被
調用的,而int sub(int x, int y)和int mul(int x, int y)則不能被調用。如過源文件
調用動態庫中的sub(或mul)函數,編譯該文件是會出現無法找到sub函數的錯誤。
pdf版下載地址:
http://byhh.net/f/Android/1298215084/Android_lib.pdf
Good luck!
--