9. 调用Java静态方法:
这里我们可以直接修改上例中的C语言本地方法,在其中加入一些code,执行静态方法System.getProperty(\"java.class.path\"),并将结果打印到控制台。
1 #include \"Printf.h\"
2 #include <stdlib.h>
3 #include <string.h>
4 #include <float.h>
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