NDK基础知识

1、NDK作用

用于扩展android sdk功能,实现一些对代码性能要求较高的模块,并将这些模块嵌入的android应用程序中。

2、代码结构

我们的NDK模块源代码由 C/C++ 头/源文件 + make文件组成,这些文件必须放在jni目录下!

理论上,我们的jni目录可以放在任何地方,例如我们放在 X/jni/ 下,在 X/jni/ 下执行ndk-build之后会在 X/ 下(即jni同级目录下)产生编译结果(即libs和obj文件夹)。

在Android Studio项目里,我们一般把jni目录放在项目根目录(即src同级目录)下,这样我们编译出来的libs和obj将会位于项目根目录下。如果要把这些编译好的C/C++库打包到apk里面供java调用,我们还必须在Module的build.gradle里面加上下面的代码:

android {
    ...
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
    ...
}

3、Android.mk文件

Android.mk是一个负责向NDK构建系统描述NDK项目的GUN Makefile片段,是每一个NDK项目的必备组件。

根据GUN Make的命名规则,变量名要大写。

4、Android.mk基本要素

4.1、Android.mk必须以 LOCAL_PATH开头(注释#除外)

LOCAL_PATH := $(call my-dir)  

4.2、必须借助CLERA_VARS变量清除除LOCAL_PATH外的所有LOCAL_<name>变量,以免冲突

include $(CLEAR_VARS) 

4.3、必须定义LOCAL_MODULE变量,该变量用于定义该模块的唯一名称。例如,

LOCAL_MODULE := fuck

这样,编出的C/C++模块文件名将是libfuck.so

4.4、通过LOCAL_SRC_FILES变量设置源文件列表,多文件用“\”隔开,例如

LOCAL_SRC_FILES := aaa.cpp \

bbb.cpp \

ccc.cpp

注意,最后一个源文件结尾不加“\”

4.5、必须在文件结尾定义编译类型

我们可以将我们的NDK模块编译成:

BUILD_SHARED_LIBRARY 共享库,供java或者其他共享库调用

BUILD_STATIC_LIBRARY 静态库,供共享库调用,不能直接被java调用。例如我们先构建一个静态库 LOCAL_MODULE := fuck_static,那么我们可以在构建共享库的时候加入 LOCAL_STATIC_LIBRARIES := fuck_static (写在LOCAL_SRC_FILES之后)来引用这个静态库。

还有其他编译类型,再次不一一列举!

我们可以在一个Android.mk文件里面定义多个相同或者不同类型的库,这些库定义以Include $(CLEAR_VARS)开始,以定义编译类型结束。例如:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := fuck_static
#fuck_static的源文件定义
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := fuck_shared_1
#fuck_shared_1的源文件定义
LOCAL_STATIC_LIBRARIES := fuck_static
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := fuck_shared_2
#fuck_shared_2的源文件定义
include $(BUILD_SHARED_LIBRARY)

注意,如果在共享库中使用LOCAL_STATIC_LIBRARIES引用静态库,那么这个静态库将被静态地添加到该共享库中,这种方式代码运行效率是最高的,但是同时会增加该共享库的体积。如果某个静态库被多个共享库同时引用n次,静态库的n个副本将被添加到这些共享库中,这样会显著增加C/C++库集合的体积。

这样的话,就需要将这个静态库编译成共享库,通过动态链接的方式供其他共享库使用(这样就不会产生相同C/C++库的多个副本)。

例如:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := fuck_shared
#fuck_shared的源文件定义
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := fuck_shared_1
#fuck_shared_1的源文件定义
LOCAL_SHARED_LIBRARIES := fuck_shared
include $(BUILD_SHARED_LIBRARY)









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值