基于本例中实例化的对象,如果打算写出数据到文件,则需要继续获取write方法的jmethod ID,之后还要获取close方法的jmethod ID,因此在使用时还是比较麻烦的。
11. 访问数组元素:
先给出Java数组类型和C数组类型之间的对应关系:
Java数组类型 C数组类型(JNI)
boolean[] jbooleanArray
byte[] jbyteArray
char[] jcharArray
int[] jintArray
short[] jshortArray
long[] jlongArray
float[] jfloatArray
double[] jdoubleArray
Object[] jobjectArray
JNI提供了以下几个C接口函数用于访问和操作Java中的数组数据:
GetArrayLength()获取数组的长度;
GetObjectArrayElement()和SetObjectArrayElement访问和设置对象数组中的元素,这样的访问方式,如果需要进行矩阵运算的高密度计算工作时,效率会比较低下,因此JNI中提供了另外一组接口方法用于直接获取数组的首地址,就像在C语言代码中操作数组一样,但是该组方法只能应用于原始数据类型,如int,short,float等。
GetXxxArrayElements和ReleaseXxxArrayElements,这里的Xxx表示不同的原始数据类型。需要注意的是,所有对数组数据的修改只有在调用ReleaseXxxArrayElements方法后才能保证所作的改变在原始Java数组中得到反映。如下例中的部分C接口(JNI)代码:
1) 包含native方法的Java类代码:
1 public class UpdateArray {
2 public static native void update(double[] d);
3 static {
4 System.loadLibrary(\"UpdateArray\");
5 }
6 }
2) 实现本地方法的C语言代码:
1 #include \"UpdateArray.h\"
2 JNIEXPORT void JNICALL Java_UpdateArray_update
3 (JNIEnv* env, jclass cl, jdoubleArray da)
4 {
5 double sacleFactor = 2.0;
6 double* a = env->GetDoubleArrayElements(da,NULL);
7 int length = env->GetArrayLength(da);
8 for (int i = 0; i < length; ++i) {
9 a[i] = a[i] * sacleFactor;
10 }
11 env->ReleaseDoubleArrayElements(da,a,0);
12 }
3) 含有main函数的调用测试代码:
1 public class MyTest {
2 public static void main(String[] args) throws Exception {
3 double[] dd = new double[10];