如何在代碼中引入系統庫?
假如目前有這樣一份文件:
#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)。