`
nanapoleon
  • 浏览: 46790 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

本地方法调用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);

静态方法的调用:
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的构造函数
   
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或者不加)。
     这种方法可以调用指定类中的指定版本的方法,而不需要动态调度。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics