10. 在C本地方法中构造Java中的对象:
我们为了方便起见,继续复用上面的Java代码,而只是修改C语言的本地方法,见如下代码:
1 #include \"Printf.h\"
2 #include <stdlib.h>
3 #include <string.h>
4 #include <float.h>
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(class_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 //获取构造函数时,方法名定义为<init>