本地方法调用5

上面调下面的方法,下面访问上面的变量,还有编码签名,还差什么?好吧,还差下面掉java层的方法嘛。
由于前面我们讲了酷似反射的变量访问,我们这章就加快速度,多讲一些,减少废话。那个,今天看了“杀生”,这类片子还真是看不懂啊~^_^
不开玩笑了,这个杀生啊,不是不是,那个访问java方法啊,我们直接上代码了,和访问field几乎差不多:
(*env)->CallXXXMethod(env, obj, method_id, args)
jmethodID GetMethodID(JNI *env, jclass cl, const char name[], const char methodSignature[])

可见,方法的调用还是id配上调用的使用方法。当然,还要用到我们的编码签名。
下面是进行方法调用的完整代码,有以下几个步骤:
1)获取隐式参数的类
2)获取方法ID
3)进行调用
class_PrintWriter = (*env)->GetObjectClass(env, out);
id_print - (*env)->GetMethodID(env, class_PrintWriter, "print", "(Ljava/lang/String;)V");
(*env)->CallVoidMethod(env, out, id_print, str)

很简单吧,我们这要就调用了void print(java.lang.String),这个方法了。
我们可以看到id和反射API中的method或者field是一一对应的,你也可以使用下面的函数在两者间进行转换:
jobject ToReflectedMethod(JNIEnv* env, jclass class, jmethodID methodID);
methodId FromReflectedMethod(JNIEnv* env, jobject method);
jobject ToReflectedField(JNIEnv* env, jclass class, jfieldID fieldID);
fieldID FromReflectedField(JNIEnv* env, jobject field);

[b]静态方法[/b]的调用:
jclass class_System = (*env)->FindClass(env, "java/lang/System");
jmethodID id_getProperty = (*env)->GetStaticMethodID(env, class_System, "getProperty","(Ljava/lang/String;)Ljava/lang/String;");
jobject obj_ret = (*env)->CallStaticObjectMethod(env, class_System, id_property, (*env)->NewStringUTF(env, "java.class.path"));
jstring str_ret = (jstring)obj_ret;

上面代码就是System.getProperty("java.class.path")的方法调用了!
还记得当时介绍编码签名时,有构造函数的签名吧,需要V的返回,我们来看看调用java的[b]构造函数[/b]:
const char[] fileName = "...";
jstring str_fileName = (*env)->NewStringUTF(env, fileName);
jclass class_fileOutputStream = (*env)->NewStringUTF(env, fileName);
jmethodID id_FileOutputStream = (*env)->GetMethodID(env, class_FileOutputStream, "<init>", "(Ljava/lang/String;)V");
jobject obj_stream = (*env)->NewObject(env, class_FileOutputStream, id_FileOutputStream, str_fileStream);

还有些不常用的方法:CallNonvirtualXxxMethod[V/A](后面可能加V或者A或者不加)。
这种方法可以调用指定类中的指定版本的方法,而不需要动态调度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值