Android Studio NDK开发环境搭建
NDK开发环境搭建其实很简单。
1、安装配置NDK
打开SDK Manager 找到NDK并下载安装
在File- >Project Structure 选择SDK Location在Android NDKLocation中设置NDK路径
2创建项目配置相关信息
老版本gradle对ndk的支持不太完善 ,现在我们使用gradle-experimental插件。gradle-experimental插件使用的时候与gradle插件稍微有点区别。
(1)配置Project的
将dependencies中classpath的值改为对应的gradle-experimental插件。
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.9.1'
}
(2)配饰 Moudle 的build.gradle
先给出一个我配置的,然后说明需要注意的
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 25
buildToolsVersion = "25.0.0"
defaultConfig {
applicationId "com.lavor.ndklearning"
minSdkVersion.apiLevel 15
targetSdkVersion.apiLevel 25
versionCode 4
versionName "1.0.1"
}
}
android.ndk {
moduleName "lavor"
ldLibs.addAll(['log'])
cppFlags.add("-std=c++11")
cppFlags.add("-fexceptions")
platformVersion 15
stl 'gnustl_shared'
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file("proguard-rules.txt"))
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support:recyclerview-v7:25.0.0'
compile 'com.android.support:design:25.0.0'
}
· (1)在apply的时候我们引入的插件名称由'com.android.application'变成了'com.android.model.application'。
· (2)在原来android的外层加入了一个model层次。
· (3)原来在android的里面的块,除了defaultConfig外,全部移除android块放入model块中与android并列,并且前面的名字加上android.。
· (4)compileSdkVersion 25与 buildToolsVersion "25.0.0"改成 compileSdkVersion = 25和buildToolsVersion = "23.0.0",中间加上了=。
· (5)添加上android.ndk块,块中的moduleName表示C/C++代码打包成so文件的名字。
· (6)android.buildTypes块中的proguardFilesgetDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'改成proguardFiles.add(file("proguard-rules.txt"))。
· (7)注意dependencies块依然在最外层,它不在model块中。
3、真正的NDK
添加一个native方法,我直接在MainActivity中添加的,也可以自己写一个类,便于管理
public native String getstringFromC();
我们注意到添加的native方法的方法名是红色的,将鼠标移动到方法名上,然后按下Alt+ Enter快捷键,弹出一些解决的方法建议,点击第一个Create Function....
此时会自动建立一个与java目录同级的jni目录,在jni目录自动建立一个c文件,在c文件中实现刚才的native方法。
#include <jni.h> JNIEXPORT jstring JNICALL Java_com_example_hp_ndktest_MainActivity_getstringFromC(JNIEnv *env, jobject instance) { // TODO return (*env)->NewStringUTF(env, "Hello Hello"); }
最后在Android程序中添加上加载so库文件的代码。
static { System.loadLibrary("lavor"); }
然后写个TextView 控件就能展示出来了
自己运行体验一下吧
当然,Android studio2.2之后,对c/c++的支持更加完善了,可以直接使用
注意:要在 AndroidStudio 中使用 CMake 或者ndk-build,需要使用 AndroidStudio 2.2 或更高的版本,同时需要配合使用 AndroidPlugin for Gradle 2.2.0 及以上的版本。
1、下载 NDK 和构建工具
要编译和调试本地代码(native code),你需要下面的组件:
The Android Native Development Kit (NDK): 让你能在 Android 上面使用 C 和 C++ 代码的工具集。
CMake: 外部构建工具。如果你准备只使用 ndk-build 的话,可以不使用它。
LLDB:Android Studio 上面调试本地代码的工具。
注意:要在 AndroidStudio 中使用 CMake 或者ndk-build,你需要使用 AndroidStudio 2.2 或更高的版本,同时需要配合使用 AndroidPlugin for Gradle 2.2.0 及以上的版本。
你可以使用 SDK Manager 来安装上述组件:
(1)打开一个项目,从菜单栏中选择 Tools > Android > SDK Manager。
(2)点击 SDK Tools 选项卡。
(3)勾选 LLDB,CMake 和 NDK。
2、创建项目
在 Configureyour new project 选项中,勾选 Include C++ Support 选项。
点击 Next,后面的流程和创建普通的Android studio 工程一样。
在 Customize C++Support 选项卡中。你有下面几种方式来自定义你的项目:
(1)C++ Standard:点击下拉框,可以选择标准C++,或者选择默认 CMake 设置的 Toolchain Default 选项。
(2)ExceptionsSupport:如果你想使用有关 C++ 异常处理的支持,就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的 cppFlags 中添加 -fexcetions 标志。
(3)Runtime TypeInformation Support:如果你想支持 RTTI,那么就勾选它。勾选之后,Android Studio 会在 module 层的 build.gradle 文件中的 cppFlags 中添加 -frtti 标志。
(4)点击 “Finish”。
项目创建好之后可以看到项目多了cpp目录
(1)cpp 目录存放你所有 native code 的地方,包括源码,头文件,预编译项目等。对于新项目,Android Studio 创建了一个 C++ 模板文件:native-lib.cpp,并且将该文件放到了你的 app 模块的 src/main/cpp/ 目录下。这份模板代码提供了一个简答的 C++ 函数:stringFromJNI(),该函数返回一个字符串:”Hello from C++”。
(2)External Build Files 目录是存放 CMake 或 ndk-build 构建脚本的地方。有点类似于 build.gradle 文件告诉 Gradle 如何编译你的 APP 一样,CMake 和 ndk-build 也需要一个脚本来告知如何编译你的 native library。对于一个新的项目,Android Studio 创建了一个 CMake 脚本:CMakeLists.txt,并且将其放到了你的 module 的根目录下。
点击 Run 按钮,Android Studio 会编译并启动一个 APP ,然后在 APP 中显示一段文字”Hellofrom C++”。从编译到运行示例APP 的流程简单归纳如下:
(1)Gradle 调用外部构建脚本,也就是 CMakeLists.txt。
(2)CMake 会根据构建脚本的指令去编译一个 C++ 源文件,也就是 native-lib.cpp,并将编译后的产物扔进共享对象库中,并将其命名为 libnative-lib.so,然后 Gradle 将其打包到 APK 中。
(3)在运行期间,APP 的 MainActivity 会调用 System.loadLibrary() 方法,加载 native library。而这个库的原生函数,stringFromJNI(),就可以为 APP 所用了。
(4)MainActivity.onCreate() 方法会调用 stringFromJNI(),然后返回 “Hello from C++”,并更新 TextView 的显示。
上述仅仅是最简单的示例,复杂的就需要发挥自己的特长来实现了