前言
编写C/C++代码最大的痛苦就是语法提示和调试,早期Android Studio对NDK不做支持或者支持得不够好,导致NDK开发异常缓慢,最大的问题是调试,经常一些崩溃问题需要反复的加日志排查。
然而现在Android Studio对NDK的开发和调试都做了比较好的支持(仍然存在一些bug)。下面就来说一下如何进行配置。
支持版本
不太确定是从哪个版本开始支持的,但我当前使用的版本能很好支持:
Android Studio 2.2.3
gradle-2.14.1-all.zip //在gradle-wrapper.properties中指定
com.android.tools.build:gradle:2.2.3 //在项目根目录下的build.gradle中指定
假如以前的项目不是这些版本,手动进行升级。
对ndk-build的支持
如果项目之前使用ndk-build那一套编译方式,即需要Android.mk,那么只要在module下的build.gradle中稍加配置即可集成,例子如下:
1 apply plugin: 'com.android.application'
2
3 android {
4 compileSdkVersion 25
5 buildToolsVersion "24.0.3"
6 defaultConfig {
7 applicationId "com.andr0day.test"
8 minSdkVersion 19
9 targetSdkVersion 25
10 versionCode 1
11 versionName "1.0"
12 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13 externalNativeBuild {
14 ndkBuild{
15 abiFilters "armeabi-v7a"
16 cFlags "-DNDKLOG"
17 cppFlags "-std=c++11"
18 }
19 }
20 }
21 buildTypes {
22 release {
23 minifyEnabled false
24 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
25 }
26 }
27 externalNativeBuild {
28 ndkBuild{
29 path "src/main/cpp/Android.mk"
30 }
31 }
32}
33
34dependencies {
35 compile fileTree(dir: 'libs', include: ['*.jar'])
36 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
37 exclude group: 'com.android.support', module: 'support-annotations'
38 })
39 compile 'com.android.support:appcompat-v7:25.0.0'
40 testCompile 'junit:junit:4.12'
41}
其中有两处需要注意:
- android.externalNativeBuild.ndkBuild配置好Android.mk的路径
- android.defaultConfig.externalNativeBuild.ndkBuild配置好ndk-build的参数
你同样可以在Android.mk的同级目录下放置Application.mk,配置依然会生效,比如在其中指定:APP_STL := stlport_static
关于Android.mk的更多知识,参考Android.mk语法解释[转]
对CMake的支持
现在AndroidStudio默认对CMake进行支持,例子如下:
1 apply plugin: 'com.android.application'
2
3 android {
4 compileSdkVersion 25
5 buildToolsVersion "24.0.3"
6 defaultConfig {
7 applicationId "com.andr0day.ndktest"
8 minSdkVersion 19
9 targetSdkVersion 25
10 versionCode 1
11 versionName "1.0"
12 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13 externalNativeBuild {
14 cmake {
15 cppFlags "-std=c++11 -frtti -fexceptions"
16 }
17 }
18 }
19 buildTypes {
20 release {
21 minifyEnabled false
22 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
23 }
24 }
25 externalNativeBuild {
26 cmake {
27 path "CMakeLists.txt"
28 }
29 }
30}
31
32dependencies {
33 compile fileTree(dir: 'libs', include: ['*.jar'])
34 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
35 exclude group: 'com.android.support', module: 'support-annotations'
36 })
37 compile 'com.android.support:appcompat-v7:25.0.0'
38 testCompile 'junit:junit:4.12'
39}
可以看到对应于之前ndkBuild的地方被调整为cmake。
关于更多CMake的知识,参见这里。
网友评论