之前写过在Android 使用NDK进行开发的博客,Android Studio 下使用JNI 但是这种方式很麻烦,我觉得NDK只是一个工具不应该在配置上弄得十分麻烦,所以我在看到gradle-experimental插件进行JNI开发的时候我就好不犹豫地进行了尝试,下面我们就来看下如何使用gradle-experimental进行JNI开发:

  • 添加NDK路径

  • 配置Project的build.gradle

将项目build.gradle配置文件的dependencies节点中中classpath的值改为对应的gradle-experimental插件。如果你不知道gradle-experimental最新的版本可以使用如下方式查询,它会返回目前的最新插件版本。

dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.7.2'
}

修改app目录下的build.gradle

//将插件名由'com.android.application'换成'com.android.model.application'。
apply plugin: 'com.android.model.application'
//新增加model节点,将原来android除了defaultConfig外的其他节点全部移到android节点外并与android并列,并且前面的名字加上android.。
model {
//该节点下的全部都换成 “ = ”
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.3"
defaultConfig {
applicationId = "com.idealist.myapplication"
//这里修改为minSdkVersion.apiLevel
minSdkVersion.apiLevel = 15
//这里修改为targetSdkVersion.apiLevel
targetSdkVersion.apiLevel = 23
versionCode = 4
versionName = "1.0.1"
testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
}
}
android.buildTypes {
release {
minifyEnabled false
//修改为proguardFiles.add
proguardFiles.add(file("proguard-rules.txt"))
}
}
//新增节点
android.ndk {
moduleName "testndk"
ldLibs.addAll(['log'])
cppFlags.add("-std=c++11")
cppFlags.add("-fexceptions")
stl 'gnustl_shared'
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha1'
testCompile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support:support-annotations:23.3.0'
}
  • 打开MainActivity 定义native方法,这时候方法会提示错误的信息,按下Alt + Enter打开备选解决方案:Create function java_com_idealist_myapplication_MainActivity_getStringFromNative
  • 这时候会在java的同级目录下自动新建一个jni的目录,并新建了一个c++源码文件:
  • 源码内容如下,我们修改这个方法通过它来返回一个字符串如下所示:
  • 使用loadLibrary引入库,在MainActivity中使用getStringFromNative
Contents