Android NDK配置

来源:互联网 发布:腾讯光子工作室 知乎 编辑:程序博客网 时间:2024/06/15 16:47

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 = 225       buildToolsVersion = "23.0.1"6       defaultConfig.with {7         applicationId = "com.kltz88.car.jnidemo"8         minSdkVersion.apiLevel = 149         targetSdkVersion.apiLevel = 2210        versionCode = 111        versionName = "1.0"12      }13      tasks.withType(JavaCompile) {14          //指定编译JDK版本15        sourceCompatibility = JavaVersion.VERSION_1_716        targetCompatibility = JavaVersion.VERSION_1_717      }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 = false29        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 JNICALLJava_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     @Override3     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_74               targetCompatibility = JavaVersion.VERSION_1_75           }</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.compileSdkVersionbuildToolsVersion rootProject.ext.buildToolsVersiondefaultConfig {applicationId "com.ph0b.example"minSdkVersion 15targetSdkVersion 23versionCode 4versionName "1.0.1"ndk {moduleName "mymodule"ldLibs "log"stl "gnustl_static"cFlags "-std=c++11 -fexceptions"}}signingConfigs {release {storeFile file(STORE_FILE)storePassword STORE_PASSWORDkeyAlias KEY_ALIASkeyPassword KEY_PASSWORD}}buildTypes {release {minifyEnabled trueshrinkResources trueproguardFiles 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.compileSdkVersionbuildToolsVersion = rootProject.ext.buildToolsVersiondefaultConfig.with {applicationId = "com.ph0b.example"minSdkVersion.apiLevel = 15targetSdkVersion.apiLevel = 23versionCode = 4versionName = "1.0.1"}}android.ndk {moduleName = "mymodule"ldLibs += ['log']cppFlags += "-std=c++11"cppFlags += "-fexceptions"stl = 'gnustl_shared'}android.signingConfigs {create("release") {keyAlias = KEY_ALIASkeyPassword = STORE_PASSWORDstoreFile = file(STORE_FILE)storePassword = KEY_PASSWORD}}android.buildTypes {release {minifyEnabled = trueshrinkResources = trueproguardFiles += 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
0 0