18 //这里Void是CallXxxMethod一组方法中的一个,表示调用函数的返回值类型。
19 //因此该方法的返回值也是void,如果调用CallIntMethod,其返回值将为jint。
20 env->CallVoidMethod(out,id_print,str);
21
22 //我们这里实例化的是FileOutputStream对象
23 const char filename[] = "D:/test.txt";
24 jstring str_filename = env->NewStringUTF(filename);
25 jclass class_FileOutputStream = env->FindClass("java/io/FileOutputStream");
26 //获取构造函数时,方法名定义为
27 jmethodID id_FileOutputStream = env->GetMethodID(class_FileOutputStream,"
28 ,"(Ljava/lang/String;)V");
29 jobject obj_Stream = env->NewObject(class_FileOutputStream,id_FileOutputStream,str_filename);
30 printf("Over\n");
31 }
基于本例中实例化的对象,如果打算写出数据到文件,则需要继续获取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];
4 for (int i = 0; i < dd.length; ++i) {
5 dd[i] = i;
6 }
7 System.out.println("The Array before updated is ");
8 for (double d : dd)
9 System.out.print(d + " ");
10 System.out.println();
11 UpdateArray.update(dd);
12 System.out.println("The Array after updated is " + dd);
13 for (double d : dd)
14 System.out.print(d + " ");
15 }
16 }
17 /* 输出结果如下:
18 The Array before updated is
19 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
20 The Array after updated is [