1、新建一个项目,命名随意,比如叫NDK_demo,然后新建一个类NDKUtil,在里面加入jni方法:
public class NDKUtil
{
public static native String test();
}
2、第一步完成,这时候会发现方法名是红色的,提示是cannot resolve,不急,接下来,配置ndk路径,可以从自己去网上下载,也可以通过Android studio下载,点击File-->Project Structure,在打开的页面的Android NDK location中选择你本地解压的ndk的目录。
3、修改项目下的build.gradle(不是app目录下的),把之前的这句
classpath 'com.android.tools.build:gradle:2.0.0'
替换成
classpath 'com.android.tools.build:gradle-experimental:0.4.0'
要在Android studio上做ndk开发,需要依赖叫experimental的插件。
4、修改app目录下的build.gradle文件,未修改前的样式如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
defaultConfig {
applicationId "com.dhhuanghui.ndk_demo"
minSdkVersion 14
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) test
Compile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.1.1'
}
修改后的样式:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig.with {
applicationId = "com.dhhuanghui.ndk_demo" minSdkVersion.apiLevel = 14
targetSdkVersion.apiLevel = 23
}
tasks.withType(JavaCompile){ sourceCompatibility=JavaVersion.VERSION_1_7 targetCompatibility=JavaVersion.VERSION_1_7
}
}
/* * native build settings */
android.ndk {
moduleName = "NdkJniDemo"
// cppFlags.add("-fno-rtti")
// cppFlags.add("-fno-exceptions")
// ldLibs.addAll(["android", "log"])
// stl = "system"
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-rules.txt'))
}
}
android.productFlavors {
// for detailed abiFilter descriptions, refer to "Supported ABIs" @
// https://developer.android.com/ndk/guides/abis.html#sa
create("arm") {
ndk.abiFilters.add("armeabi")
}
create("arm7") {
ndk.abiFilters.add("armeabi-v7a")
}
create("arm8") {
ndk.abiFilters.add("arm64-v8a")
}
create("x86") {
ndk.abiFilters.add("x86")
}
create("x86-64") {
ndk.abiFilters.add("x86_64")
}
create("mips") {
ndk.abiFilters.add("mips")
}
create("mips-64") {
ndk.abiFilters.add("mips64")
}
// To include all cpu architectures, leaves abiFilters empty
create("all")
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
}
其中android.ndk中配置的moduleName,作用如下
static {
System.loadLibrary("NdkJniDemo");//之前在build.gradle里面设置的so名字,必须一致
}
android.productFlavors配置后,编译后会在app->build->intermediates->objectFiles下生成so库,平台看自己的需求。
5、接下来我们生成头文件,首先选择Build->make project,编译生成class文件,位置在app->build->intermediates->classes->all->debug目录,我们直接在studio的terminal中使用cd命令切换到当前项目的main目录,然后通过如下命令在main目录下生成jni文件夹以及头文件
C:\Demo\NDK_demo\app\src\main>javah -d jni -classpath C:\Tools\adt-bundle-windows-x86_64-20140702\sdk\platforms\android-19\android.jar;C:\Demo\NDK_demo\app\build\intermediates\classes\all\debug com.dhhuanghui.ndk_
demo.jni.NDKUtil
这时候再去编译项目,发现第二步提到的红色错误已经消失了。
6、这时候我们可以在jni目录下新建一个c文件,然后编写代码。
ps:有时候在头文件中会出现<jni. h>为红色的情况,这时候需要把gradle-experimental:0.4.0'修改成其他版本,比如0.7.0,再重新编译,错误就会消失