虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦。NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用Java的引用类型则要做相应的处理。
一、对引用数据类型的操作
虽然Java的引用类型的实现在NDK被屏蔽了,JNI还是提供了一组API,通过JNIEnv接口指针提供原生方法修改和使用Java的引用类型。
1、字符串操作
JNI把Java的字符串当作引用来处理,在NDK中使用Java的字符串,需要相关的API进行转换。JNI支持Unicode编码和UTF-8编码的字符串,有两组函数通过JNIEnv接口指针处理这些字符串编码:
jstring javaString;
javaString = (*env)->NewStringUTF(env, "Hello World");
该方法生成一个的UTF-8编码字符串。
2、Java字符串转C字符串
要在原生方法中使用Java字符串,需要将Java字符串转成C字符串。可以调用GetStringChars函数:
const jbyte *str;
jboolean isCopy;
str = (*env)->GetStringUTFChars(env, javaString, &isCopy);
第三个参数isCopy,可以用作判断该函数返回的字符串是否是Java字符串的副本,还是直接指向Java字符串的内存。
3、释放字符串
通过JNIEnv调用的GetStringChars和GetStringUTFChars函数获得的C字符串在使用完后要正确释放,否则就会造成内存泄漏。可通过ReleaseStringUTFChars函数(用于释放Unicode)和ReleaseStringUTFChars函数(用于释放UTF-8)释放字符串。
(*env)->ReleaseStringUTFChars(env, javaString, str);
(*env)->ReleaseStringChars(env, javaString, str);
二、数组操作
JNI把Java的数组也是当作引用类型处理的,不过JNI还