AndroidStudio使用NDK配置方法

来源:互联网 发布:wav音乐下载软件 编辑:程序博客网 时间:2024/06/07 03:25

转载地址:http://blog.csdn.net/cauchyweierstrass/article/details/53261581?ref=myread


  • 配置Gradle生成so
  • 编译多个模块
  • 关联Androidmk到Gradle
  • 使用cmake

配置Gradle生成so

在AndroidStudio2.1及以前我是通过下面的方式配置NDK的,不知道是从哪个版本开始的,我第一次在AS上使用NDK的时候用的就是AndroidStudio2.1了。

首先在gradle.properties里面添加 Android.useDeprecatedNDK = true

android{}下的defaultconfig{}代码块中添加ndk{}

ndk{    moduleName = "xxx"    //abiFilters("armeabi", "armeabi-v7a"..)    //ldLibs = ["log"]    //cFlags    //stl(ie:gnustl_shared,stlport_static..)}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

默认在src/main/jni目录下面找c/c++文件编译,也可以在android{}下添加sourceSet{}

sourceSet{    main{        jni.srcDirs=['src/main/cpp']    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

就能将指定目录下的c/c++文件编译成指定的模块名.so。

编译多个模块

上面这种方式通过gradle无法编译成多个模块,编译多个模块还是要自己写Android.mk文件实现,通过手动执行ndk-build编译成的*.so文件默认在src/main/libs下面。

打包APK时,默认是寻找so的目录是/build/intermediates/ndk和/build/intermediates/jniLibs,前者是使用源码由Gradle编译成的so所处的位置,后者一般是一些第三方的so或者自己手动使用ndk编译生成的so文件所生成的,这个位置在src/main/jniLibs。

因此手动编译好so文件后,将其复制到jniLibs下面,或者在此放置第三方so,或者在build.gradle文件里面的android下面添加jniLib.srcDir定义了Gradle在哪里寻找生成的so库文件

sourceSets{  main{    jniLib.srcDirs=['src/main/libs']  // jniLib.srcDirs定义了Gradle在哪里寻找生成的so库文件  }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

上面就是使用ndk-build通过自己定义Android.mk生成so的方式,但是分析apk文件(build->Analyze APK)发现打包进去来了两个so,下面libnative-lib.so是我在Android.mk中设置的模块名。上面这个其实是Gradle构建的,Gradle构建so的时候默认模块名字就是app,并且默认的编译c/c++的路径是src/main/jni,要修改这两个默认设置就需要像上面配置Gradle构建so的方式修改。

use_ndk--build1.png

为了在我们自己构建so的时候禁用Gradle需要做的是配置jni.srcDirs设置成一个空的数组,这样就可以禁用通过Gradle来编译本地c/c++代码。

sourceSets{  main{    jni.srcDirs=[]  // jni.srcDirs禁用通过Gradle来编译本地c/c++代码  }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

再看apk结构,由Gradle构建的so就不见了。

use_ndk--build2.png

关联Android.mk到Gradle

AndroidStudio2.2以后的另一种使用Android.mk的方式,可以不用ndk-build手动构建。

不需要手动使用ndk-build编译,只需要将其关联到Gradle上,Gradle 会将 ndk-build作为一个依赖运行,然后将so打包到 apk 中,编译好的so在目录/build/intermediates/ndkBuild下面。

鼠标右键要链接的本地库所在的模块,选择Link C++ Project with Gradle,在弹出的对话框中选择Build System为ndk-build,再指定Amdroid.mk的路径点击ok即可

select_ndk.png

这样就不用在命令行中手动执行ndk-build编译了,Gradle就会自动的构建写好的Android.mk。

上面的操作实际是也可以直接在该模块的build.gradle中的android下面添加

android {  ...  defaultConfig {...}  buildTypes {...}  // add manually  externalNativeBuild {    ndkBuild {      path "Android.mk"      // arguments "-DCMAKE_VERBOSE_MAKEFILE=TRUE"      // Sets optional flags for the C compiler.      // cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"      // Sets a flag to enable format macro constants for the C++ compiler.      // cppFlags "-D__STDC_FORMAT_MACROS"    }  }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

使用cmake

AndroidStudio2.2以后还推出了使用cmake脚本来构建so,方式为在模块根目录下创建CMakeLists.txt

# Sets the minimum version of CMake required to build your native library.# This ensures that a certain set of CMake features is available to# your build.cmake_minimum_required(VERSION 3.4.1)# Specifies a library name, specifies whether the library is STATIC or# SHARED, and provides relative paths to the source code. You can# define multiple libraries by adding multiple add.library() commands,# and CMake builds them for you. When you build your app, Gradle# automatically packages shared libraries with your APK.add_library( # Specifies the name of the library.             native-lib            # Sets the library as a shared library.             SHARED            # Provides a relative path to your source file(s).            src/main/jni/native-lib.c )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

然后和上面关联ndk-build脚本的方式类似,在弹出的对话框中选择Build System为cmake,再指定CMakeLists.txt的位置。这样操作类似与直接在该模块的build.gradle中的android下面添加

android {  ...  defaultConfig {...}  buildTypes {...}  // add manually  externalNativeBuild {    cmake {      path "CMakeLists.txt"    }  }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

脚本语法

Android.mk

Application.mk

CMake


0 0