缘由
Android SDK 提供了一套 OpenGL ES 接口,但该接口是基于 Java 的,速度非常慢,往往很难满足需要。
NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动 将 so和 java 应用一起打包成 apk。使用 NDK,我们可以将要求高性能的应用 逻辑使用C开发,从而提高应用程序的执行效率。如 OpenGL ES 的程序。
对于 NDK,在 Java 代码中调用 C/C++ 代码是通过 JNI 实现的。
Java Native Interface(JNI)是 Java 语言的本地编程接口,在java程序中, 我们可以通过 JNI 实现一些用 java 语言不便实现的功能。通常有以下几种情 况我们需要使用 JNI 来实现:
- java 类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的;
- 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的;
- 程序的某些部分对速度要求比较苛刻,你选择用汇编或者 c 语言来实现并在 java 语言中调用他们。
注意,不到万不得已不要使用 JNI 技术,一方面它需要你把握更多的知识才可 以驾驭,一方面使用了 JNI 你的程序就会丧失可移植性。
OpenGL ESJava 端核心代码如下所示:
1 | public class DemoAct extends Activity { |
JNI 代码如下所示:
1 | #include <jni.h> |
C 语言端
1 | void appInit() |
调试
要想在 jni native 代码中看打印信息,printf 是不行的,需使用 __android_log_print,如下所示。
1 | __android_log_print(ANDROID_LOG_INFO, "ProjectName", "I am : %d\n", n); |
该函数与 printf 用法相似,使用格式字符。打印的结果通过 logcat 查看。注意,使用时需要将头文件 android/log.h 包含进来。为方便使用,往往定义一些宏
1 | #include <android/log.h> |