【摘錄】Android開發之動態庫調用

來源:互聯網
上載者:User
1.編寫並產生Android下可用的動態庫
(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/system/bin目錄下。

3.在Android模擬器中使用
(1)啟動模擬器
(2)運行程式
    等待模擬器初始化完成後,將lib_test檔案push進模擬器,並將libmy_add.so檔案push至模擬器的system/lib目錄下。
    由於模擬器下/system/目錄為制度目錄,需修改許可權,使用adb remount 命令。依次執行:    
    #adb remount
    # adb push /home/android/out/target/product/generic/system/lib/libmy_add.so /system/lib
    # adb push /home/android/out/target/product/generic/system/bin/lib_test /data
    執行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函數的錯誤。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.