• Android JNI系列详解之ndk-build工具的使用


    一、Android项目中使用ndk-build工具编译库文件

    之前介绍过CMake编译工具的使用,今天介绍一种ndk自带的编译工具ndk-build的使用。

    ndk-build目前主要有两种配置使用方式:

     如上图所示,第一种方式是Android.mk+Application.mk+gradle的方式生成库文件;第二种方式是Android.mk+Application.mk+命令行的方式生成库文件,接下来就是介绍这两种方式的使用。

    1、ndk-build配置构建1(Android.mk+Application.mk+gradle)

    Android.mk:用于向ndk-build编译工具描述源文件和库的信息,如要生成什么类型的库(动态、静态),库的名称,以及生成库使用了哪些C/C++源码文件,或者使用了哪些第三方库文件,等等。

    Application.mk:工程级别的,作用是指定ndk-build的项目范围设置,如C/C++标准库的支持,Android平台版本设置,cpu指令集对应的abi设置,等等。

    Android.mk是ndk-build编译必配的一个文件,Application.mk是可选配的(如编译的目标库未使用C/C++标准库,也不需要指定cpu指令集对应的abi),如果未配置Application.mk会走默认的这些配置。Application可选配的另一个原因是,里面的配置可以放到gradle中配置。

    1. LOCAL_PATH表示源文件所在的位置,call my-dir是表示会调用ndk-build提供的宏函数my-dir,这个方法会返回Android.mk文件本身所在的目录路径。

    2.include $(CLEAR_VARS) 用于清理部分LOCAL开头的变量,但不会清理上面的LOCAL_PATH。

    3.LOCAL_MODULE表示配置库的名称。

    4.LOCAL_SRC_FILES表示配置的源文件,生成库需要哪些源文件或者第三方库。

    5.include $(BUILD_SHARED_LIBRARY) 表示指定编译目标库类型(静态动态)

    1.APP_STL 表示配置C++标准库支持

    2.APP_ABI 表示配置abi过滤

    3.APP_PLATFORM 表示指定Android平台版本

    2、新建项目使用ndk-build编译源代码

    不同于CMake的项目,我们重新新建了一个项目

    haha.cpp  native源文件:

    C++源码文件和CMake那边差不多

    Android.mk:

    Application.mk:

    build.gradle:

    配置好这些文件之后,我们make一下项目,在build目录下就生成了库文件:

    Android中使用上面生成的库文件:

    运行:

    3、ndk-build配置构建2(Android.mk+Application.mk+命令终端)

    这种方式就是比较方便,不依赖于AS这种ide工具,可以在文件夹下便可以编译出库文件。

    这种方式需要将上面放在cpp文件夹下的文件,换到jni文件下,目前不知道啥原因。

    另外我把gradle中的之前的配置都删了:

    开始使用终端命令进行编译:今入到这个jni的目录中,输入ndk-build回车就行。

    生成的库文件在:自动放在了jni同级文件夹下的libs文件夹中:另外多了个obj文件夹,不用管。

    这时候去运行项目,会出现崩溃,错误是找不到libhaha.so

    Android中使用上面生成的库文件:android项目中要使用库文件,要将库文件放到Android默认的系统jni目录:jniLibs,因此我们将上面的libs改成jniLibs,重新运行,正常:

    如果就是想使用上面生成的libs文件夹,也是可以的,就需要在gradle中配置一下:

    这种方式就是将来编译的时候,去找jniLibs就会自动去src/main/libs下面找我们的库文件,打包进apk里面。

    二、配置库文件的输出路径

    上面的ndk-build编译过程,我们都没指定我们想要输出的路径,都是使用默认的目录,要么在build下,要么在libs目录下,这里我们配置文件的输出目录。

    在Android.mk下配置如下

    ../jniLibs是香炉路径,相对的是Android.mk的位置。../是代表的Android.mk的上一级目录,即在mk文件的上一级同级的目录下创建jniLibs目录。

    使用ndk-build命令就可以看到生成了jniLibs目录。这样jniLibs就是编译apk的时候默认寻找的目录。

    如果是这个目录,我们的build.gradle中就不需要指定这个

  • 相关阅读:
    从车窗升降一探 Android 车机的重要 API:车辆属性 CarProperty
    项目进展(三)-电机驱动起来了,发现了很多关键点,也遇到了一些低级错误,
    蓝牙耳机什么牌子音质最好?音质超好的蓝牙耳机推荐
    第十三届蓝桥杯省赛 C++ C 组 E 题、Python B组 D题、PythonC组 D 题—— 数位排序(AC)
    [Linux]动静态库
    如何裁剪视频画面?快来看看这个详细教程
    leetcode动态规划算法总结——更新
    写代码的七八九十宗罪,多图、胆小慎入!
    C++11
    js 8位字母数组组合校验
  • 原文地址:https://blog.csdn.net/sunbinkang/article/details/132529465