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

2014-11-24 03:21:35 · 作者: · 浏览: 2
ss MyTest {

3 public static void main(String[] args) throws Exception {

4 double price = 44.95;

5 double tax = 7.75;

6 double amountDue = price * (1 + tax / 100);

7 PrintWriter out = new PrintWriter(System.out);

8 Printf.fprint(out,"Amount due = %8.2f\n", amountDue);

9 out.flush();

10 }

11 }

9. 调用Java静态方法:

这里我们可以直接修改上例中的C语言本地方法,在其中加入一些code,执行静态方法System.getProperty("java.class.path"),并将结果打印到控制台。

1 #include "Printf.h"

2 #include

3 #include

4 #include

5

6 JNIEXPORT void JNICALL Java_Printf_fprint

7 (JNIEnv* env, jclass cl, jobject out, jstring format, jdouble x)

8 {

9 const char* cformat = env->GetStringUTFChars(format,NULL);

10 char* cstr = (char*)calloc(strlen(cformat) + 20,sizeof(char));

11 sprintf(cstr,cformat,x);

12 jstring str = env->NewStringUTF(cstr);

13 free(cstr);

14 env->ReleaseStringUTFChars(format,cformat);

15

16 jclass class_PrintWriter = env->GetObjectClass(out);

17 //对应于void PrintWrite.print(String)方法

18 jmethodID id_print = env->GetMethodID(class_PrintWriter,"print","(Ljava/lang/String;)V");

19 //这里Void是CallXxxMethod一组方法中的一个,表示调用函数的返回值类型。

20 //因此该方法的返回值也是void,如果调用CallIntMethod,其返回值将为jint。

21 env->CallVoidMethod(out,id_print,str);

22

23 //访问静态方法System.getProperty的代码如下:

24 //1. 由于没有System的实例存在,因此需要使用FindClass方法,而不是上面使用的

25 //GetObjectClass()

26 jclass class_System = env->FindClass("java/lang/System");

27 //2. String System.getProperty(String) 为该静态方法的Java原型

28 //由于是静态方法,因此JNI方法名有别于上面的GetMethodID。

29 jmethodID id_getProperty = env->GetStaticMethodID(class_System,"getProperty",

30 "(Ljava/lang/String;)Ljava/lang/String;");

31 //3. 注意CallStaticObjectMethod中Static同样表示调用的是static方法,Object表示

32 //返回的是Object,这里String就是Object。

33 jobject obj_ret = env->CallStaticObjectMethod(class_System,id_getProperty

34 ,env->NewStringUTF("java.class.path"));

35 //4. 从jobject到jstring的向下转型。

36 jstring str_ret = (jstring)obj_ret;

37 const char* outStr = env->GetStringUTFChars(str_ret,NULL);

38 printf("The java.class.path is %s.\n",outStr);

39 env->ReleaseStringUTFChars(str_ret,outStr);

40 }

10. 在C本地方法中构造Java中的对象:

我们为了方便起见,继续复用上面的Java代码,而只是修改C语言的本地方法,见如下代码:

1 #include "Printf.h"

2 #include

3 #include

4 #include

5 JNIEXPORT void JNICALL Java_Printf_fprint

6 (JNIEnv* env, jclass cl, jobject out, jstring format, jdouble x)

7 {

8 const char* cformat = env->GetStringUTFChars(format,NULL);

9 char* cstr = (char*)calloc(strlen(cformat) + 20,sizeof(char));

10 sprintf(cstr,cformat,x);

11 jstring str = env->NewStringUTF(cstr);

12 free(cstr);

13 env->ReleaseStringUTFChars(format,cformat);

14

15 jclass class_PrintWriter = env->GetObjectClass(out);

16 //对应于void PrintWrite.print(String)方法

17 jmethodID id_print = env->GetMethodID(clas