Android NDK开发基础 使用Android Studio编写NDK

25次阅读

共计 2564 个字符,预计需要花费 7 分钟才能阅读完成。

前情提要首先我们得学习了 Java 与 C /C++ 的交互,使用 Java 调用 C /C++ 函数,使用 C /C++ 调 Java 的方法和创建 Java 对象等等。在上个系列中,我们使用的是 Eclipse 与 VS 进行的开发,因为延续的是 C 语言基础系列的做法,所以开发工具未作切换。在 NDK 系列中,我们将采用最新的 Android Studio 进行开发,版本是 Android studio 2.2 RC 2,NDK 版本采用的是最新的 r12b。
开发环境工具下载地址(win)(需要科学上网):Android Studio 2.2 RC2 — Android Studio Download 2.2 RC2Android NDK r12b — Android NDK r12b 64bitAndroid NDK r12b — Android NDK r12b 32bit
国内镜像站:androiddevtools
关于开发环境的说明因为在 Android studio 2.2 之前的版本,对 C /C++ 支持不是很好,也没有语法提示,写起来不是很方便,构建工具也不是很完整,所有采用最新的 Android studio 2.2 RC2 来进行编写,但,Android studio 2.2 RC2 还是 Beta 版本,所有,不建议现在应用到生产环境中,等 google 发布了 Stable 版本之后再应用。目前建议,可以使用 Eclipse 编写.so,然后应用到现在的生产环境中。
创建 NDK 项目
第一步,创建支持 C ++ 的项目
C++ support
其他的选项使用默认的即可。
第二步,关联 NDK

创建完成之后会报如下错误:

ndk r12b
在项目配置中,关联 NDK 之后就会 ok

config ndk
第三步,编写 native 类及处理方法

在创建项目的时候,勾选了 C ++ support,项目创建完成之后,会自动帮我们生成一个 cpp/native-lib.cpp

auto create cpp file
你可以不用修改文件名,在新建 native 方法的时候,会提示你创建一个 C ++ 的 JNI 函数,直接创建就会生成一个 JNI 函数,都不用使用 javah 生成一个头文件,然后再引入头文件了,非常之方便。

auto create jni function 1
创建函数:

auto create jni function 2
在这里,就不使用默认的.cpp 文件了,我们新建一个.c 文件,创建了 HelloNDK.c 文件之后,Android Studio 会提示我们,需要在 Android.mk/CMakeLists.txt 中进行声明,这里,我们使用默认的 CMakeLists.txt 建构工具(创建项目的时候自动生成)。
第四步,build.gradle 配置:

externalNativeBuild {
cmake {
cppFlags “”
// 指定只用 clang 编译器
// Clang 是一个 C 语言、Objective-C、C++ 语言的轻量级编译器。
arguments “-DANDROID_TOOLCHAIN=clang”
// 生成.so 库的目标平台
abiFilters “armeabi-v7a” , “armeabi”
}
}

// 配置 CMakeLists.txt 路径
externalNativeBuild {
cmake {
path “CMakeLists.txt”
}
}

第五步,修改 CMakeLists.txt

add_library(# Sets the name of the library.
HelloNDK # 生成的.so 库文件名称

# Sets the library as a shared library.
SHARED

# Provides a relative path to your source file(s).
# Associated headers in the same location as their source
# file are automatically included.
# 需要生成的.so 库的文件路径
src/main/cpp/HelloNDK.c
)

target_link_libraries(# Specifies the target library.
# 项目链接的.so 库名称
HelloNDK

# Links the target library to the log library
# included in the NDK.
${log-lib} )

第六步,编写 native 方法,以及 C 函数
/**
* Created by Zeno on 2016/9/10.
*
* NDK Demo
*/

public class HelloNDK {

public static native String sayHelloNDK() ;

static {
System.loadLibrary(“HelloNDK”);
}
}

#include <jni.h>
JNIEXPORT jstring JNICALLJava_com_zeno_encryptanddecrypt_ndk_HelloNDK_sayHelloNDK(JNIEnv *env, jclass thiz) {
// TODO
return (*env)->NewStringUTF(env, “this String come from C “);
}

native 方法的编写以及 C 函数的写法,我们都非常熟悉了,这里就不再解释各自的意义了。
第七步,编译
make
编译完成之后,我们可以切换到 project 视图,来查看.so 文件 make success
第八步,运行
run
如果使用的是 genymotion 模拟器,这需要在 abiFilters 加入 x86,不然项目会运行不起来的。当然,也可以使用一个 genymotion 的 arm 插件,这样不配置 x86 也可以运行。
// 生成.so 库的目标平台
abiFilters “armeabi-v7a” , “armeabi” , “x86”

结语做为 Android 开发者,从最开始的 Eclipse 开发工具,到现在日渐成熟的 Android Studio,还有几乎可以看得见成长的 Android System,我很庆幸,从一开始就选择了 Android 平台,从初学 Android 到现在的日渐深入,Android 在成长,我也在成长。见证了 Android 从一个丑小鸭变成了,一个羽翼渐丰的白天鹅,不论从操作系统的易用性和 UI 友好性,它的成长都是有目共睹的。感谢 Android。写的不好,有什么不对的地方欢迎来喷,有大佬有不同的见解欢迎一起来探讨交流!

正文完
 0