年初列的计划中包含了NDK的学习,不过一直被耽搁了,这几天有时间就参考了网上的一些教程,做了一个简单的总结。主要参考学习,就作为转载了。
参考文章:(1)http://www.jianshu.com/p/7844aafe897d 这篇文章讲解的是使用非命令行方式实现NDK编程,更加简洁
(2)http://bbs.51cto.com/thread-1316339-1-1.html 这篇文章详细介绍了jdk的安装,android studio的安装等步骤,对NDK的讲解也比较细致,对初学者有很好的参考价值。
1、首先创建一个Android工程NdkTest2(由于之前创建过一个NdkTest项目删除不彻底,所以新建的项目名多了一个2),打开NdkTest2/gradle/wrapper目录下的gradle-wrapper.properties文件,修改gradle的版本为2.10,如下所示:
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
2、修改项目根目录下的build.gradle文件,将gradle的classpath修改为
classpath 'com.android.tools.build:gradle-experimental:0.6.0-beta5'
这是因为NDK需要“experimental”这个插件
3、修改app目录下的build.gradle文件,这个文件修改内容较多,红色代码是新增的部分(即被span包裹的代码)
apply plugin: 'com.android.model.application'//这个地方不再使用com.android.application,而是com.android.model.application
model{//在android{...}外层添加model{...}
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig.with {//defaultConfig改为defaultConfig.with
applicationId "com.xuhui.ndktest"
minSdkVersion.apiLevel 8 //minSdkVersion改为minSdkVersion.apiLevel,targetSdkVersion同样修改
targetSdkVersion.apiLevel 23
versionCode= 1//添加"="号
versionName= "1.0"
}
}
android.ndk {
moduleName = "lb" //这是将来so文件的名称,自己取
}
android.buildTypes {//buildTypes从android{}中移出,放到model{}中,并添加前缀android.
release {
minifyEnabled= false
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
proguardFiles.add(file("proguard-rules.pro"))//注释掉之前的混淆配置,改为这种方式
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}
4、创建jni目录,右击“app”目录,在弹出的菜单中依次选择New→Folder→Jni Folder,然后点击finish完成
5、创建MyNdk.java文件,用来加载c++库
package com.xuhui.ndktest;
/**
* Created by dell on 2016/12/7.
*/
public class MyNdk {
static{//加载c++库
System.loadLibrary("lb");//lb为库的名字
}
public native String getString();//库里的方法getString
}
按住Caps Lock+Alt+Enter键创建.c文件,(网上说是Options键,不过我的电脑是按Caps Lock键)lb.c文件默认创建在jni目录下,打开lb.c文件,内容如下,
#include <jni.h>
JNIEXPORT jstring JNICALL
Java_com_xuhui_ndktest_MyNdk_getString(JNIEnv *env, jobject instance) {
// TODO
return (*env)->NewStringUTF(env, returnValue);
}
修改"returnValue"值为“hello,ndk!”,在Activity中,设置TextView的值为getString的返回值,
textview.setText(new MyNdk().getString());
运行项目如下,
6、gradle各版本对应关系如下,