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)。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值