NDK官方文档:http://developer.android.com/intl/zh-cn/ndk/index.html
The Android NDK is a toolset that lets you implement parts of your app using native-code languages such as C and C++. For certain types of apps, this can help you reuse existing code libraries written in those languages.
public class MyActivity extends Activity {
/**
* Native method implemented in C/C++
*/
public native void computeFoo();
}
Ndk基本使用介绍:
http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html
从Android Studio 1.3 Beta1开始,就支持了NDK。不过使用的是一个全新的实验性的gradle构建工具。官方地址 http://tools.android.com/tech-docs/new-build-system/gradle-experimental ,英文好的可以直接看原文。
在进行配置前请先将Android Studio更新至最新版本,目前最新版本是1.4 Bata4
Android Studio使用新的Gradle构建工具配置NDK环境
并且使用Android Studio内置的SDK管理器下载NDK。
Android Studio使用新的Gradle构建工具配置NDK环境
或者在项目上右键打开Project Structure,切到的SDK Location页进行安装
Android Studio使用新的Gradle构建工具配置NDK环境
注意这个NDK安装好后其目录在SDK目录下的ndk-bundle目录下,与以往的不同。
要修改的文件见下图
Android Studio使用新的Gradle构建工具配置NDK环境
首先需要将根目录下的gradle修改为实验性的gradle
classpath ‘com.android.tools.build:gradle-experimental:0.2.0’
最终是这样的
Android Studio使用新的Gradle构建工具配置NDK环境
并且需要gradle 2.5的支持,将gradle/gradle-wrapper.properties中的版本修改为2.5
distributionUrl=https/://services.gradle.org/distributions/gradle-2.5-all.zip
最终是这样的
Android Studio使用新的Gradle构建工具配置NDK环境
然后修改原来的app/build.gradle,注意现在各项配置都是有等号的,并且使用的是 com.android.model.application而不再是原来的com.android.application,如果是Library,则 是com.android.model.library。然后android外围包了一层model。原来在android里面的buildTypes 移到了外面。等等,看下面内容,注意变化。
1 <span style="font-size: medium;">apply plugin: 'com.android.model.application'
2 model{
3 android {
4 compileSdkVersion = 22
5 buildToolsVersion = "23.0.1"
6 defaultConfig.with {
7 applicationId = "com.kltz88.car.jnidemo"
8 minSdkVersion.apiLevel = 14
9 targetSdkVersion.apiLevel = 22
10 versionCode = 1
11 versionName = "1.0"
12 }
13 tasks.withType(JavaCompile) {
14 //指定编译JDK版本
15 sourceCompatibility = JavaVersion.VERSION_1_7
16 targetCompatibility = JavaVersion.VERSION_1_7
17 }
18 }
19 android.ndk {
20 moduleName = "test"
21 ldLibs +="log"
22 abiFilters +="armeabi"
23 abiFilters +="armeabi-v7a"
24 abiFilters +="x86"
25 }
26 android.buildTypes {
27 release {
28 minifyEnabled = false
29 proguardFiles += file( 'proguard-rules.pro')
30 }
31 }
32 }
33 dependencies {
34 compile fileTree(dir: 'libs', include: ['*.jar'])
35 compile 'com.android.support:appcompat-v7:22.2.1'
36 }</span>
在android.ndk中进行ndk的配置,模块名字是必须的。然后使用了log,并且支持armeabi,armeabi-v7a,x86三个平台。
然后增加jni目录,在main上右键新建jni目录
Android Studio使用新的Gradle构建工具配置NDK环境
在弹出的窗口中你可以修改jni目录,默认是在main/jni中
Android Studio使用新的Gradle构建工具配置NDK环境
新建一个Test的类,加载jni库,声明native方法
public class Test { static {
System.loadLibrary("test");
} public native void test();
}
这时候你会发现test方法是红色的
Android Studio使用新的Gradle构建工具配置NDK环境
在上面按alt+enter生成c层的方法
Android Studio使用新的Gradle构建工具配置NDK环境
修改为下方的代码
include <jni.h> #include "android/log.h" JNIEXPORT void JNICALL
Java_com_kltz88_car_jnidemo_Test_test(JNIEnv *env, jobject instance) {
__android_log_write(ANDROID_LOG_ERROR,"TAG","TEST");
}
如果你需要生成头文件,使用命令行即可
Android Studio使用新的Gradle构建工具配置NDK环境
之后会在jni目录生成对应的头文件
Android Studio使用新的Gradle构建工具配置NDK环境
然后在java层调用
1 <span style="font-size: medium;">public class MainActivity extends AppCompatActivity {
2 @Override
3 protected void onCreate(Bundle savedInstanceState) {
4 super.onCreate(savedInstanceState);
5 setContentView(R.layout.activity_main);
6 Test t=new Test();
7 t.test();
8 }
9 }</span>
便会看到日志的输出。
Android Studio使用新的Gradle构建工具配置NDK环境
注意如果没有在gradle中指定java的对应版本,运行时可能会报错
1 <span style="font-size: medium;">tasks.withType(JavaCompile) {
2 //指定编译JDK版本
3 sourceCompatibility = JavaVersion.VERSION_1_7
4 targetCompatibility = JavaVersion.VERSION_1_7
5 }</span>
错误信息如下,遇到该错误加上上面的代码即可
Android Studio使用新的Gradle构建工具配置NDK环境
最后就是调试的问题了,理论上来说应该是支持调试的,但是我在windows上并没有试验成功。下面贴出步骤。
Android Studio使用新的Gradle构建工具配置NDK环境
增加native运行方法
Android Studio使用新的Gradle构建工具配置NDK环境
修改为
Android Studio使用新的Gradle构建工具配置NDK环境
然后下断点,理论上是能调试的,但是我遇到了下面的问题,导致无法继续,也查过了,查不出问题所在,就这样吧,改天在linux下试试是不是正常。
Android Studio使用新的Gradle构建工具配置NDK环境
你会发现整个流程下来,原来的Android.mk和Application.mk都不再需要了,所有配置在gradle中配置即可。
官方的github示例代码
https://github.com/googlesamples/android-ndk
我的示例代码
http://download.csdn.net/detail/sbsujjbcy/9108775
/*************************************参考二************************************/
在2015的Google I / O大会,5月底,谷歌宣布了一项新的支持由Android NDK Studio 1.3,Jetbrains CLion集成功能,Android gradle插件。这种支持只在7月已经发布,虽然很有前途,还是在沉重的发展。
新的工具包支持需要使用Android Studio 1.3 RC1 +和Android gradle-experimental插件。
gradle-experimental插件需要使用gradle - 2.6或更高版本。
1.应用设置gradle版本
gradle-2-5
2.文本设置gradle版本
gradle/wrapper/gradle-wrapper.properties:
distributionUrl=https://services.gradle.org/distributions/gradle-2.6-all.zip
然后,改变对android的引用gradle新gradle-experimental插件,插件。/ build.gradle:
复制代码
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath ‘com.android.tools.build:gradle-experimental:0.3.0-alpha5’
}
}
复制代码
你需要修改build.gradle文件来使用这些新的插件。这是相同的配置的一个例子,老的DSL(顶部)和新(底部):
old DSL
复制代码
apply plugin: 'com.android.application'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.ph0b.example"
minSdkVersion 15
targetSdkVersion 23
versionCode 4
versionName "1.0.1"
ndk {
moduleName "mymodule"
ldLibs "log"
stl "gnustl_static"
cFlags "-std=c++11 -fexceptions"
}
}
signingConfigs {
release {
storeFile file(STORE_FILE)
storePassword STORE_PASSWORD
keyAlias KEY_ALIAS
keyPassword KEY_PASSWORD
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.release
}
debug {
jniDebuggable true
}
}
}
dependencies {
compile 'com.android.support:support-v4:23.0.1'
compile fileTree(dir: 'libs', include: ['*.jar'])
}
复制代码
new DSL
复制代码
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = rootProject.ext.compileSdkVersion
buildToolsVersion = rootProject.ext.buildToolsVersion
defaultConfig.with {
applicationId = "com.ph0b.example"
minSdkVersion.apiLevel = 15
targetSdkVersion.apiLevel = 23
versionCode = 4
versionName = "1.0.1"
}
}
android.ndk {
moduleName = "mymodule"
ldLibs += ['log']
cppFlags += "-std=c++11"
cppFlags += "-fexceptions"
stl = 'gnustl_shared'
}
android.signingConfigs {
create("release") {
keyAlias = KEY_ALIAS
keyPassword = STORE_PASSWORD
storeFile = file(STORE_FILE)
storePassword = KEY_PASSWORD
}
}
android.buildTypes {
release {
minifyEnabled = true
shrinkResources = true
proguardFiles += file('proguard-rules.txt')
// signingConfig = signingConfigs.release //not activated yet because of https://code.google.com/p/android/issues/detail?id=182249}
}
}
dependencies {
compile 'com.android.support:support-v4:23.0.1'
compile fileTree(dir: 'libs', include: ['*.jar'])
}
复制代码
总的改变在所有android的声明在modle{}内,各个变量的赋值使用显示的”=”,数组不能被复写(用+=),变量和其他新配置必须使用声明”创建()’比如xxxSdkVersion改为xxxSdkVersion.apiLevel属性。
你可以在DSL进行配置NDK,默认就可以不使用Android.mk老配置了.
开始新的c++ / NDK支持AndroidStudio
1.首先在build.gradle配置NDK模块的声明来激活c++ / NDK支持
model {
//…android.ndk {
moduleName = “mymodule”
}
}
2.完成这步你就可以在Java文件下创建一个方法带Native关键字,并且按ALT+Enter来生成C++,实现:
AS-ndk-demo
就这么简单方便。
实现的cpp文件将被添加在jni文件夹中。
为了使用NDK模块,这里google提供了github的例子https://github.com/googlesamples/android-ndk
下面是你配置ndk需要的所有配置:
复制代码
android.ndk {
moduleName = “mymodule”
ldLibs += [‘log’]
ldFlags += “”
toolchain = “clang”
toolchainVersion = “3.9”
abiFilters += “x86”
CFlags += “”
cppFlags += “”
debuggable = false
renderscriptNdkMode = false
stl = “system”
platformVersion = 15
}
复制代码
NDK项目的调试
Android Studio 1.3 +支持LLDB和GDB后端的调试功能,创建和使用一个新的从Android原生“运行/调试配置默认值:
native-debug-config
使用你的debug调试你的NDK,默认设置debugable标志totrue.
//2016-11-23
配置build.gradle的classpath:
具体可以参考http://tools.android.com/tech-docs/new-build-system/gradle-experimental
Each version of the experimental plugin requires a specific version of Gradle. Here is a list of required Gradle version.
Plugin Version | Gradle Version |
---|---|
0.1.0 | 2.5 |
0.2.0 | 2.5 |
0.3.0-alpha3 | 2.6 |
0.4.0 | 2.8 |
0.6.0-alpha1 | 2.8 |
0.6.0-alpha5 | 2.10 |
0.7.0-alpha1 | 2.10 |
0.7.0 | 2.10 |
0.7.3 | 2.14.1 |