开始使用 Android NDK 进行开发,NDK 的主要原理还是 JNI 技术,这一技术实现了 Java代码和 C/C++代码间的相互调用,这样做的好处是:首先,将一些比较耗时的操作放到底层来实现,毕竟C和C++的效率高比Java高,并且指针是可以加快程序的运行速度;其次. 在C语言领域,已经有很多成熟的类库和框架,使用NDK后,可以直接使用他们,因而避免再用Java去重复制造轮子。
Android NDK的开发,需要Linux的编译环境,所以建议直接装个Linux系统,在上面进行Android开发,当然也可以使用虚拟机来代替,不过个人觉得虚拟机始终不伦不类,还是真正的Linux环境比较顺手。
使用NDK时的大致步骤如下:
1. 新建一个Android 工程,在里面新建一个jni 文件夹,专门用来存放 C 语言程序和Android.mk 文件;
2. 在java文件中编写一个 native 函数:
package tangyuchun.ndk.hellojni;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HellojniActivity extends Activity {
static {
System.loadLibrary("hello-jni");
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText(getString());// 调用了native方法
setContentView(tv);
}
public native static String getString();
}
这里是一个简单的Activity界面,里面定义了一个 getString()方法,用来获取一个字符串。
3. 打开终端,使用 javah -classpath 命令编译 bin/classes 下生成的 .class文件。我的命令如下:
javah -classpath /home/administrator/android_code/hello-jni/bin/classes tangyuchun.ndk.hellojni.HellojniActivity
也可以在src的 .java 源代码中使用同样的命令:
javah -classpath /home/administrator/android_code/hello-jni/src tangyuchun.ndk.hellojni.HellojniActivity
记得在前面要加上包名(我的是在tangyuchun.ndk.hellojni 这个包下面)。
4. 经过第3步后,就会在该类目录下生成一个 .h 的头文件(Ubuntu也有可能生成在主文件夹下面),名字为
tangyuchun_ndk_hellojni_HellojniActivity.h,打开这个头文件,内容如下:
#include <jni.h>
/* Header for class tangyuchun_ndk_hellojni_HellojniActivity */
#ifndef _Included_tangyuchun_ndk_hellojni_HellojniActivity
#define _Included_tangyuchun_ndk_hellojni_HellojniActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: tangyuchun_ndk_hellojni_HellojniActivity
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
5. 看到里面有一个函数: JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(JNIEnv *, jclass);
这个方法就与第2步的getString()对应。
6. 在jni 文件夹中新建一个 c语言文件,我的是 hello-jni.c ,include相应的头文件,然后将第4步中的那个方法复制,完成该方法: