iOS技术文章iOS进阶

Android Studio 2.2 gradle调用ndk-b

2017-01-11  本文已影响1854人  熊皮皮

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中加上拷贝动态库命令更方便,如下所示。

Make Project生成的动态库

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

使用过程中,发现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'
    }
}
上一篇 下一篇

猜你喜欢

热点阅读