有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JNI一般使用C还是C++编写呢?
Android平台在中间层和大部分的类库的底层使用了C++的开发方式,后缀为.cpp,比如Android Framework、OpenCore、Webkit、SQLite等等。使用C++好处就是可以使用很多库但目前Android不支持STL,我们知道 C表示字符串都是字符数组,但C++可以使用类似string这样的类型表示。
1. 代码上编写C和C++有啥区别
这里Android123就以将Java的unicode字符串转为jni中的utf8,然后再返回一个jstring类型为例子,可以看到jni和java之间字符串的转换方法。
C的实现:
C++的实现:
我们加粗了主要区别的关键字,可以看到C++的代码更简练。
2. JNI操作数组代码
JNI中处理数组通用对象为jobjectArray 当然常规的类型比如整形为jintArray,布尔型为jbooleanArray,但没有出现jstringArray这样的类型,有关字符数组的处理我们将在下次的 Android JNI开发进阶篇 详细说明 。处理数组时我们需要考虑数组的长度不能为0才能继续操作,不然就会有访问越界等问题,在JNI中提供了通用类型的GetArrayLength函数。我们从Java传入一个以整形数组,在JNI中将每个元素相加为例返回一个整形告诉Java运算的结果。
如何在JNI中构造一个数组呢? Android开发网给大家一个简单的示例,返回一个整形数组:
3. JNI中有关异常的处理
JNI中抛出异常没有try...catch这样的,而是直接抛出错误
方法1: 使用ThrowNew,比如IOException类发生了FileNotFound
方法2: 使用Throw,自己构造