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
原创粉丝点击