Android JNI开发(7)--mk文件编写

作为一个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 := -Werror
LOCAL_C_INCLUDES := \
        $(LOCAL_PATH)/ \
        $(LOCAL_PATH)/../ \
        $(LOCAL_PATH)/../rapidjson/include \
        $(LOCAL_PATH)/../libFFmpge/ \

LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%)
LOCAL_CFLAGS += -DANDROID_NDK
LOCAL_CFLAGS += -DLOG_NDEBUG
LOCAL_CFLAGS += -DACCESS_RAW_DESCRIPTORS
LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl
LOCAL_LDLIBS += -llog
LOCAL_LDLIBS += -landroid
#指定了多个共享库
LOCAL_SHARED_LIBRARIES += usb100 uvc

LOCAL_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
#生成动态.so
include $(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.c

LOCAL_C_INCLUDES += \
    $(LOCAL_PATH)/ \
    $(LOCAL_PATH)/libusb \
    $(LOCAL_PATH)/libusb/os \
    $(LOCAL_PATH)/../ \

LOCAL_EXPORT_C_INCLUDES := \
    $(LOCAL_PATH)/ \
    $(LOCAL_PATH)/libusb

# add some flags
LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%)
LOCAL_CFLAGS += -DANDROID_NDK
LOCAL_CFLAGS += -DLOG_NDEBUG
LOCAL_CFLAGS += -DACCESS_RAW_DESCRIPTORS
LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays
LOCAL_EXPORT_LDLIBS += -llog
LOCAL_ARM_MODE := arm

LOCAL_MODULE := libusb100_static
#生成静态库
include $(BUILD_STATIC_LIBRARY)

######################################################################
# libusb.so
######################################################################
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_EXPORT_LDLIBS += -llog
#LOCAL_WHOLE_STATIC_LIBRARIES会加载整个静态库,LOCAL_STATIC_LIBRARIES只是加载静态库中用到的函数。
LOCAL_WHOLE_STATIC_LIBRARIES = libusb100_static

LOCAL_MODULE := libusb100
include $(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.mk
include $(PROJ_PATH)/libjpeg-turbo-1.4.0/Android.mk
include $(PROJ_PATH)/libusb/android/jni/Android.mk
include $(PROJ_PATH)/libuvc/android/jni/Android.mk
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值