Android.mk 之 引入庫

如何在代碼中引入系統庫?

假如目前有這樣一份文件:

#include<stdio.h>
#define LOG_TAG "Main"
#include <utils/Log.h>

int main(void)
{
   ALOGE("test");
   return 0;
}

在這份文件中,除了引用了<stdio.h>,還使用了<utils.Log.h>,這個是Android系統中打印log的一個頭文件,這裏我們使用它的ALOGE來做一個打印。

在編譯它的Android.mk 中,如果不添加這個文件它所需要的庫,它也是編不過的,因爲ALOGE只是一個宏,它真正的實現還是在其他地方做的,我們應該引入真正定義這個函數的庫。

所以,我們需要在Android.mk 中加入一個選項,來把我們的庫編上,這樣在編譯的時候就可以找到需要的庫。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := src/main.cpp
#添加系統庫
LOCAL_SHARED_LIBRARIES += liblog
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)

使用參數LOCAL_SHARED_LIBRARIES後面加上庫的名字,在編譯的時候就會自動去系統下面去尋找我們添加的庫。

 

如何引入三方庫?

在Android.mk中,目前是用 src/test1.cpp 編譯生成了一個動態庫,並放在了 /bin 目錄。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_SRC_FILES := src/test1.cpp
LOCAL_MODULE_PATH := $(LOCAL_PATH)/lib
include $(BUILD_SHARED_LIBRARY)

現在,有 test1.cpp,它的內容如下:

void call_test(void)
{
    return;
}

我想在 main.cpp 裏面使用 src/test1.cpp 裏面的函數。

#include<stdio.h>
#define LOG_TAG "Main"
#include <utils/Log.h>

//聲明
extern void call_test(void);

int main(void)
{
   //調用
   call_test();
   ALOGE("test");
   return 0;
}

下面就以庫的形式來進行導入,可以使用引入第三方庫文件的語法:LOCAL_LDFLAGS := -L/庫的路徑 -l庫的名字。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_SRC_FILES := src/test1.cpp
LOCAL_MODULE_PATH := $(LOCAL_PATH)/lib
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := test
//引入第三方庫
LOCAL_LDFLAGS := -L./lib -ltest
LOCAL_SRC_FILES := src/main.cpp
lOCAL_SHARED_LIBRARIES += liblog
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)

當開始編譯test的二進制程序時,就會自動去找 /lib 下的libtest.so,這樣一來,在 /lib 下先生成了一個libtest.so,然後,又在 /test 下生成了一個test二進制程序。

 

如何引入第三方頭文件?

在上面的例子中是以 extern 的形式來導入我們的函數的,現在我們再用頭文件的形式。

現在在 /inc 的文件夾下有一個test1.h的頭文件,爲了防止重定義,如果沒有這個test1.h,就先define test1.h;然後再在函數裏面進行了聲明:

#ifndef TEST1_H
#define TEST1_H
extern void call_test(void);
#endif

然後再這裏就不需要聲明call_test了。

#include<stdio.h>
#define LOG_TAG "Main"
#include <utils/Log.h>
//使用絕對路徑來查找
#include <test1.h>

//聲明
//extern void call_test(void);

int main(void)
{
   //調用
   call_test();
   ALOGE("test");
   return 0;
}

目前來講肯定是找不到這個文件的,我們還需要在Android.mk中加入一個選項;

在Android.mk中,引入第三方頭文件的選項是 LOCAL_C_INCLUDES := 頭文件的路徑。

include $(CLEAR_VARS)
LOCAL_MODULE := test
//指定頭文件路徑
LOCAL_C_INCLUDES += $(LOCAL_PATH)/inc/
//引入第三方庫
LOCAL_LDFLAGS := -L./lib -ltest
LOCAL_SRC_FILES := src/main.cpp
lOCAL_SHARED_LIBRARIES += liblog
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)

 

如何使用靜態庫?

假如將一個靜態庫拷貝到 /lib/libtest1.a ,這樣,在 /lib下就有了一個靜態庫,這時候使用靜態庫需要修改Android.mk的LOCAL_LDFLAGS選項。

include $(CLEAR_VARS)
LOCAL_MODULE := test
//指定頭文件路徑
LOCAL_C_INCLUDES += $(LOCAL_PATH)/inc/
//使用靜態庫
LOCAL_LDFLAGS := $(LOCAL_PATH)/lib/libtest1.a
LOCAL_SRC_FILES := src/main.cpp
lOCAL_SHARED_LIBRARIES += liblog
LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)

在使用靜態庫時一定要使用使用絕對路徑$(LOCAL_PATH)。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章