gradle-experimental可以在不用编写.mk文件的情况下进行NDK开发。
做NDK开发有件比较麻烦的事情就是Application.mk
和Android.mk
的编写。而gradle-experimental就是用来解决这个麻烦的。
gradle-experimental是Android Studio的一个实验性的项目,基于gradle的一个插件,主要用来自动化NDK的配置实现,无需自己编写Application.mk
和Android.mk
,对于调试NDK项目也更加的友好。
环境要求:
- gradle>2.10
- Android NDK r10e
- Build Tools 19.0.0
配置gradle-experimental
- 添加依赖
在项目的主目录下./build.gradle
替换build tools,使用gradle-experimental
12345678910111213buildscript {repositories {jcenter()}dependencies {classpath "com.android.tools.build:gradle-experimental:0.7.0-alpha4"}}allprojects {repositories {jcenter()}} - 替换插件
在gradle中不能再使用com.android.application
了,需要使用com.android.model.application
替代。 - 在项目主目录下的
./app/build.gradle
中更改plugin
apply plugin: “com.android.model.application”
- 配置model{}
123456789101112131415161718192021model {android {compileSdkVersion 23buildToolsVersion "23.0.2"defaultConfig {applicationId "com.jjz"//需要使用.apiLevelminSdkVersion.apiLevel 15targetSdkVersion.apiLevel 23versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled false}}}}
配置NDK
在配置NDK之前需要确认:
- NDK包是否下载
- NDK的环境变量是否配置
以上配置完成之后,在./app/build.gradle
中配置android.ndk
1 2 3 4 5 6 7 8 9 10 11 12 |
model { android { compileSdkVersion 23 buildToolsVersion "23.0.2" ndk{ moduleName "experiment" } } } |
这里定义的moduleName
就是后面生成的NDK的包名。
源代码配置
默认情况下,我们在src/main/jni下使用的是c/c++文件。需要在model.android中指定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
model { android { compileSdkVersion 23 buildToolsVersion "23.0.2" ndk { moduleName "experiment" } sources { main { jni { source { srcDir "src/main/jni" } } java{ source{ srcDir "src/main/java" } } } } } } |
分别指定了java
源代码和jni
源代码的目录。
NDK代码
在java里面定义一个native
方法,native标识的方法会需要在jni中实现,在java中调用。
1 2 3 4 5 6 7 8 |
public class NativeUtil { //加载ndk类库 static { System.loadLibrary("experiment"); } public static native String firstNative(); } |
出现一个红色的警告:
可以使用alt+enter
键自动生成jni方法:
生成的jni方法
1 2 3 4 5 6 7 8 9 |
**#include ** JNIEXPORT jstring JNICALL Java_com_jjz_NativeUtil_firstNative(JNIEnv *env, jclass type) { // TODO return (*env)->NewStringUTF(env, returnValue); } |
修改jni方法返回的内容
1 2 3 4 |
JNIEXPORT jstring JNICALL Java_com_jjz_NativeUtil_firstNative(JNIEnv **env, jclass type) {* * return (**env)->NewStringUTF(env, "is first native"); } |
运行
打开Toolbar中的运行配置菜单,可以看到:
多出了一个app-native
的菜单,可以直接运行。
调用NativeUtil.firstNative的方法,会得到jni中写好的返回值:
is first native
可以看到使用gradle-experimental
开发NDK,不用复杂的配置,自动化native方法,不需要定义.h头文件,对调试友好。
文中源代码地址:https://github.com/jjz/android/tree/master/experimental