Android Studio 2.2 gradle调用ndk-build

Android Studio 2.2已支持gradle调用CMake或ndk-build编译C/C++代码。因个人对gradle了解较少,尝试了以下几种功能模块组织方式(迁移ndk-build项目至Android Studio开发):

  1. 改写Android.mk至CMakeList。此方式学习成本最高。因不熟悉CMakeList编写,在成功链接libpng动态库、libyuv静态库后,尝试在项目中引入libffmpeg.so出现clang++无法识别av_register_all等符号。因怀疑FFmpeg使用gcc编译器,生成的动态库对于clang++可能不识别。虽然理论上相应平台的机器码是通用的。多次尝试修改gradle、CMakeList指定使用g++,总是提示相应ARM版本的g++编译器找不到,不得不放弃这种使用方式。
  2. 继续使用gradle调用Android.mk。此方式过渡相对自然,将源码拷贝到新建的app项目并填写正确的Android.mk路径,然后在app模块下的build.gradle文件中加上ExternalNativeBuild命令,基本顺利通过编译,如下所示。
// android {
  externalNativeBuild {
      ndkBuild {
          path "src/main/jni/Android.mk"
      }
  }

每次使用Make Project生成的动态库都在build目录下,在build.gradle中加上拷贝动态库命令更方便,如下所示。

《Android Studio 2.2 gradle调用ndk-build》 Make Project生成的动态库

而且Make Project每次都是增量编译,即直接调用ndk-build。下面描述了不同的Android Studio开发功能模块(SDK)项目组织方式。

  • 在app可执行模块中直接添加C/C++代码。这种方式最简单,编辑好相应的C/C++文件,再通过ndk-build打包给客户使用。调试时正好是apk,可单步调试C/C++代码。

  • 新建module模块编译C/C++供app模块调用,app模块纯粹编写测试使用的DEMO。此种方式可通过File->New Module…->Android Library添加,在Android视图中可看到新增的Module项目。Module项目编译得到的aar文件包含了以前通过ndk-build编译得到的一或多个动态库。为了让app模块能正常引用module(保证编译顺序),需要配置编译依赖。

    • 在settings.gradle中添加需要编译的模块。
    include ':app', ':your-cpp-library-module'
    
    • 在app模块中添加编译依赖。在app模块的build.gragle找到dependencies代码块,插入compile project语句并指定前面的Android Library。
    dependencies {
        compile project(":your-cpp-library-module")
    }
    

使用过程中,发现gradle直接调用ndk-build,Android.mk有效、而Application.mk无效,需要将Application.mk文件中的内容写到build.gradle中,下面举例。

Application.mk内容如下:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions -std=gnu++11 -Wno-format-contains-nul -g -Wno-deprecated-declarations
APP_CPPFLAGS +=-fpermissive
APP_PLATFORM := android-14
APP_ABI := armeabi-v7a

对应的gradle内容为:

defaultConfig {
    // ...
    externalNativeBuild {
        ndkBuild {
            arguments 'APP_STL=gnustl_static',
                'APP_PLATFORM=android-14',
                'NDK_TOOLCHAIN_VERSION=4.9'
            cppFlags '-frtti',
                '-fexceptions',
                '-std=gnu++11',
                '-Wno-format-contains-nul',
                '-g',
                '-Wno-deprecated-declarations',
                '-fpermissive'
        }
    }
    ndk {
        abiFilters 'armeabi-v7a'
    }
}
    原文作者:熊皮皮
    原文地址: https://www.jianshu.com/p/0e50ae3c4d0d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞