Step By Step(Java 本地方法篇) (七)

2014-11-24 03:21:35 · 作者: · 浏览: 5
s_PrintWriter,"print","(Ljava/lang/String;)V");

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 [