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

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'
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,018评论 25 708
  • Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI...
    AlphaGL阅读 3,777评论 0 24
  • 文章摘要1、 c、c++项目的创建2、添加C、C++项目依赖库4、配置Gradle,编译lib so库 英文文献 ...
    Android那些事儿阅读 12,812评论 0 54
  • 像萤火 照耀了 老家的一朵朵 云 来生 是一段尴尬的归途 桃花源里有人 随便喂食 饭后 搬一张小木凳 对着路人指手...
    留子尧阅读 290评论 3 11
  • 刚刚百度搜索了一下,什么是正能量?“正能量”指的是一种健康乐观、积极向上的动力和情感,是社会生活中积极向上的行为。...
    慧峰诺阅读 335评论 0 0