Android JNI开发(7)--mk文件编写
来源:互联网 发布:剑三萝莉精致捏脸数据 编辑:程序博客网 时间:2024/06/08 19:12
作为一个Android应用开发者,也经常会遇到编写mk文件的问题,也应该掌握各种类型的mk文件的编写。其实这东西不难,只是我们不了解。
根据例子,由浅入深的了解
第一个例子
首先,看一个最简单的mk文件,也是hello jni级别的:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.c include $(BUILD_SHARED_LIBRARY)
这里Android.mk文件放在jni/目录下,hello.c放在jni/目录下。
以上内容的解释:
LOCAL_PATH := $(call my-dir)
LOCAL_PATH:每一个Android.mk文件都必须有LOCAL_PATH,它表示的是当前Android.mk文件所在的目录路径,并在此基础上对C/C++的源码查找定位等。
my-dir:由编译系统提供的宏函数,返回当前Android.mk文件所在的目录路径;
include $(CLEAR_VARS)
CLEAR_VARS是编译系统预定义的一个变量,它指向一个特殊的Makefile,这个Makefile负责清除 LOCAL_xxx 的变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES 等)但不会清除 LOCAL_PATH。
LOCAL_MODULE := hello
LOCAL_MODULE 用来给每个模块定义一个名字,不同模块的名字不能相同,不能有空格,这里的模块是以生成的一个so包包含的文件为范围的。这里的名字会传给NDK编译系统,然后加上lib前缀和.so后缀 (例如,变成libhello-jni.so)。
LOCAL_SRC_FILES := hello.c
在LOCAL_SRC_FILES 变量里面列举出对应于同一个模块(.so)的、要编译的.c文件,不需要.h文件,编译系统可以自动检测头文件依赖关系。
include $(BUILD_SHARED_LIBRARY)
这个 BUILD_SHARED_LIBRARY也是编译系统预定义的变量,也是指向一个Makefile文件,负责将你在 LOCAL_XXX 等变量中定义信息收集起来,确定要编译的文件,如何编译。如果要编译的是静态库而不是动态库,则可以用 BUILD_STATIC_LIBRARY。
静态库:.a文件,貌似不能再Android应用中直接使用
动态库:.so文件,可以直接加载。
第二个例子
看一个稍微复杂点的例子:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)####################################################################### Make shared library libUVCCamera.so######################################################################CFLAGS := -WerrorLOCAL_C_INCLUDES := \ $(LOCAL_PATH)/ \ $(LOCAL_PATH)/../ \ $(LOCAL_PATH)/../rapidjson/include \ $(LOCAL_PATH)/../libFFmpge/ \LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%)LOCAL_CFLAGS += -DANDROID_NDKLOCAL_CFLAGS += -DLOG_NDEBUGLOCAL_CFLAGS += -DACCESS_RAW_DESCRIPTORSLOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arraysLOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldlLOCAL_LDLIBS += -llogLOCAL_LDLIBS += -landroid#指定了多个共享库LOCAL_SHARED_LIBRARIES += usb100 uvcLOCAL_ARM_MODE := arm#执行多个源文件的方法LOCAL_SRC_FILES := \ _onload.cpp \ utilbase.cpp \ c_file1.cpp \ c_file2.cpp \ c_file3.cpp \ c_file4.cpp \ Parameters.cpp \LOCAL_MODULE := UVCCamera#生成动态.soinclude $(BUILD_SHARED_LIBRARY)
在针对以上例子进行解释如下:
CFLAGS :表示用于 C 编译器的选项,
-Werror:表示要求GCC将所有警告当成错误处理;
CXXFLAGS :表示用于 C++ 编译器的选项。
LOCAL_C_INCLUDES:引入所需要的头文件
LOCAL_CFLAGS :指定当编译C/C++源码的时候,传给编译器的标志。它一般用来指定其他的编译选项和宏定义。
LOCAL_SHARED_LIBRARIES:指定的是运行时该模块(.so库)所依赖共享库(可指定多个)。这些信息是链接阶段必须的
LOCAL_ARM_MODE :指示编译目标文件的指令集,arm指令使用两种模式,一种是Thumb(每条指令两个字节),一种是arm指令(每条指令4个字节)
第三个例子
# my-dir在往上面取两父级LOCAL_PATH := $(call my-dir)/../..include $(CLEAR_VARS)# changed linux_usbfs.c => android_usbfs.c# changed linux_netlink.c => android_netlink.c# these sources are also modified.LOCAL_SRC_FILES := \ libusb/core.c \ libusb/descriptor.c \ libusb/hotplug.c \ libusb/io.c \ libusb/sync.c \ libusb/strerror.c \ libusb/os/android_usbfs.c \ libusb/os/poll_posix.c \ libusb/os/threads_posix.c \ libusb/os/android_netlink.cLOCAL_C_INCLUDES += \ $(LOCAL_PATH)/ \ $(LOCAL_PATH)/libusb \ $(LOCAL_PATH)/libusb/os \ $(LOCAL_PATH)/../ \LOCAL_EXPORT_C_INCLUDES := \ $(LOCAL_PATH)/ \ $(LOCAL_PATH)/libusb# add some flagsLOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%)LOCAL_CFLAGS += -DANDROID_NDKLOCAL_CFLAGS += -DLOG_NDEBUGLOCAL_CFLAGS += -DACCESS_RAW_DESCRIPTORSLOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arraysLOCAL_EXPORT_LDLIBS += -llogLOCAL_ARM_MODE := armLOCAL_MODULE := libusb100_static#生成静态库include $(BUILD_STATIC_LIBRARY)####################################################################### libusb.so######################################################################include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_EXPORT_LDLIBS += -llog#LOCAL_WHOLE_STATIC_LIBRARIES会加载整个静态库,LOCAL_STATIC_LIBRARIES只是加载静态库中用到的函数。LOCAL_WHOLE_STATIC_LIBRARIES = libusb100_staticLOCAL_MODULE := libusb100include $(BUILD_SHARED_LIBRARY)
第四个例子
#返回当前的my-dir目录下的所有子目录的Android.mk文件的列表。#include $(call all-subdir-makefiles)#可以自定义一个变量PROJ_PATH := $(call my-dir)include $(CLEAR_VARS)#打包过程中,包括下面路径下的mk文件include $(PROJ_PATH)/UVCCamera/Android.mkinclude $(PROJ_PATH)/libjpeg-turbo-1.4.0/Android.mkinclude $(PROJ_PATH)/libusb/android/jni/Android.mkinclude $(PROJ_PATH)/libuvc/android/jni/Android.mk
- Android JNI开发(7)--mk文件编写
- android studio编写jni,ndk程序(不用mk文件)
- jni开发之 Android.mk文件解析
- Android.mk文件编写
- android mk文件编写
- android.mk文件编写
- jni Android.mk文件分析
- 编写Android.mk Application.mk文件
- JNI开发的常见错误&&Android.mk文件说明&& jni开发的简便流程
- Android.mk文件编写示例
- Android.mk文件的编写
- Android.mk文件编写规则
- 如何编写Android.mk 文件
- 关于android.mk文件编写
- jni使用基础(三)之Android.mk文件详解
- android JNI学习-Android.mk文件详解
- android--jni--Android.mk文件分析
- android jni Android.mk文件详解
- 欢迎使用CSDN-markdown编辑器
- Java toString方法重载的作用
- 微信小程序如何引入外部字体库 Iconfont
- 简易日期组件
- javascript 方法中的参数字符串如何解决
- Android JNI开发(7)--mk文件编写
- 批次查找策略select * from 存取顺序找到的批次表table where 选择条件B sort by 排序C
- xml文件与obj的最简单转换
- linux dup2函数
- centos6.5 克隆后修改网卡信息
- Hadoop HDFS分布式环境搭建
- 利用元祖返回多个不同的对象
- 【MongoDB】MongoDB限制和阈值 Limits and Thresholds
- 数据结构学习笔记(6)---二叉树的创建与求深度