声明:
本文是自己在学习中做的一些总结,希望我的总结可以对你有所帮助。同时需要注意的是在文中Android.mk与Makefile是一个东西,都是用来编译程序的脚步,所以大家不用太纠结这个名称。
自己碰到的问题:
我昨天对一个文件中的内容进行了修改,但是发现编译成功后我的log内容并没有在log中显现,同时我发现原有的log的行数还是没有修改前的行数,所以我可以确定自己的修改并没有编译到生成的so中,所以我调用的时候就没有自己修改的内容了。
解决方法:
1. 看一下自己修改内容的目录下的Android.mk文件中是否包含自己修改的文件,如果没有包含,那么说明这个文件压根就不会被编译,所以不管你做了什么都没有用的,不过这个情况还是很少出现的。一般如果以前会运行的文件,那么他一定在Makefile中有所包含,所以这个时候你要看的是:LOCAL_SRC_FILES 这个tag了,这个tag表示要加载的源文件。我们接着讲,这个时候我看到了自己编辑的源文件session.c 。
2. 确定了我们修改的文件所在,接下来就要看:LOCAL_MODULE这个tag了,这个tag用于表示这个模块所特有的名称,通过这个名称就可以区别这个模块。
3. 确定了模块的名称后,下面要注意的是文件结尾结尾出的tag:include $(BUILD_STATIC_LIBRARY)。因为这个tag可以指明模块要编译为一个什么东西,例如上面的 BUILD_STATIC_LIBRARY就表示要编译为一个静态的库,而BUILD_SHARED_LIBRARY则表示要编译为动态的库。BUILD_EXECUTABLE表示可执行文件。
4. 对于上面我的问题,我所要修改的文件编译为一个名为:libhls的静态库,如下所示:
LOCAL_MODULE := libhls
include $(BUILD_STATIC_LIBRARY)
5. 搜索看那个文件中引用了libhls这个静态库,由于我要编译的大的模块为Player,所以在这个目录下搜索libhls,使用下面的命令:
grep -rn "libhls" Player/*
6. 对搜索到的内容进行筛选,由于我们知道libhls是一个静态的库,所以对静态库引用的tag为:
LOCAL_STATIC_LIBRARIES
所以我们要选择有LOCAL_STATIC_LIBRARIES 和libhls的语句,搜索如下:
LOCAL_STATIC_LIBRARIES := libhls
同时如果想要引用动态的库可以使用下面的标签:
LOCAL_SHARED_LIBRARIES
利用下面的标签来引用动态的库,如下:
LOCAL_SHARED_LIBRARIES :=crypto
7. 同样这个时候我们需要重复上面步骤3到6,来查看这个Makefile的结尾是什么,并且能生成什么。然后一路查找看如何调用,并查看是否有LOCAL_MODULE_PATH这个tag,这个tag表示模块生成路径,而这个时候通常表示要生成外部可以调用的so文件。这里对应的tag为:
LOCAL_MODULE_PATH:=$(TARGET_OUT_SHARED_LIBRARIES)/player
8. 查找到这里就可以知道如何编译以及调用哪个so的文件来包含自己的修改了。例如我对应得修改文件一直由这里的so动态库调用,所以可以使用由下到上的mm递归以及模块最后就将你修改的内容编进so动态库中,而你只需要将这个动态库复制到对应的库中就可以解决上面的问题了 。
扩充:
除了上面介绍的这些信息,我们还有些tag是需要知道的,下面我在几个事例中表明一些tag的作用:
//
include $(call all-subdir-makefiles)
在一些Android.mk中只有一句话,就是上面这样的,他的意思是他会包含所有下层的Makefile,也就是说当在这个文件下mm的时候其实是递归的对这个Makefile下层的Makefile进行编译。
下面举个例子:
all-subdir-makefiles: 返回一个位于当前’my-dir’路径的子目录中的所有Android.mk的列表。
例如,某一子项目的目录层次如下:
src/foo/Android.mk
src/foo/lib1/Android.mk
src/foo/lib2/Android.mk
如果 src/foo/Android.mk 包含一行:
include $(call all-subdir-makefiles)
那么它就会自动包含 src/foo/lib1/Android.mk 和 src/foo/lib2/Android.mk。
这项功能用于向编译系统提供深层次嵌套的代码目录层次。
注意,在默认情况下,NDK 将会只搜索在 src/*/Android.mk 中的文件。
this-makefile: 返回当前Makefile 的路径(即这个函数调用的地方)
parent-makefile: 返回调用树中父 Makefile 路径。即包含当前Makefile的Makefile 路径。
grand-parent-makefile:返回调用树中父Makefile的父Makefile的路径
/
//
LOCAL_PATH := $(call my-dir) //用于指明当前所在文件的路径,接下来就可以直接使用
// LOCAL_PATH 来指明当前Makefile的路径了
include $(CLEAR_VARS) //一般放到开始的位置来清除变量,指定让GNU MAKEFILE为你清除除
//LOCAL_PATH以外的所有LOCAL_XXX变量,清楚它们可以避免冲突
LOCAL_ARM_MODE := arm //默认情况下,arm目标二进制会以thumb的形式生成(16位),你
// 可以通过设置这个变量为arm如果你希望你的module是以32位指令的形式。
LOCAL_MODULE_TAGS := optional
ifeq ($(LIVEPLAY_SEEK), true) //这里是一个if的判断语句,通过使用if可以有选
//择性的添加一些模块或者属性
LOCAL_CFLAGS += -DSEEK // -D相当于是在加一个宏定义:
// #define LIVEPLAY_SEEK
endif
LOCAL_SRC_FILES := parser.c \ //定义包含的源文件
session.c \ //文件之间可以用空格或Tab键进行分割,换行请用"\"
//如果是追加源代码文件的话,请用LOCAL_SRC_FILES +=
LOCAL_C_INCLUDES := \ //定义搜索头文件的可能目录,注意这里是通过
//LOCAL_PATH作为参考来查找的目录地址
$(LOCAL_PATH)/../common \
$(LOCAL_PATH)/../include \
ifeq ($(BUILD_WEB), true)
LOCAL_CFLAGS += -DWEB
endif
LOCAL_SHARED_LIBRARIES +=libamavutils //文件中使用的动态库
LOCAL_MODULE := libhls //模块名称
ifeq ($(TARGET_ARCH),arm)
LOCAL_CFLAGS += -Wno-psabi //-W表示警告选项
endif
include $(BUILD_STATIC_LIBRARY) //最终编译生成静态库
///
Ps:
ifeq ($(strip $(BLUETOOTH_USE_BPLUS)),true) 选者编译 如果BLUETOOTH_USE_BPLUS这个模块有定一为true,则编译进去
LOCAL_CFLAGS += -DBLUETOOTH_USE_BPLUS 这个语句等价为 #define BLUETOOTH_USE_BPLUS
(菜鸟级别解释::=是赋值的意思,$是引用某变量的值
---------------------
作者:旭飞
来源:CSDN
原文:https://blog.csdn.net/wuhui790517095/article/details/8878506
版权声明:本文为博主原创文章,转载请附上博文链接!
///
参考文件:
Android NDK 学习笔记 4-Android.mk 篇
android.mk中LOCAL_CFLAGS 介绍 : tag解释
Android.mk文件中LOCAL_CFLAGS常见设置:Android.mk文件中LOCAL_CFLAGS常见设置