`
nanapoleon
  • 浏览: 48157 次
  • 性别: 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或者不加)。
     这种方法可以调用指定类中的指定版本的方法,而不需要动态调度。
分享到:
评论

相关推荐

    C++本地方法调用

    调用iphlpapi获得本地ip信息,C++源代码演示获取ip信息的全过程。

    JAVA通过本地方法调用C例子

    本案例将详细讲解如何在Java中通过本地方法调用C语言实现的功能,具体以一个调用系统时间的简单例子进行说明。 首先,我们来看`TimeShow.java`这个Java类,它通常包含了一个native方法声明,例如: ```java public...

    Java语言如何调用C++语言编写的本地方法

    5.实现本地方法 在生成的头文件中,每个本地方法都有对应的函数原型,用C或C++实现这些函数。实现本地方法时,需要遵循特定的签名约定,以确保Java虚拟机可以正确识别和调用它们。 6.创建动态链接库 将实现的本地...

    Android中调用js方法及js中调用本地方法

    本文将详细讲解如何在Android中调用JavaScript的方法,以及JavaScript如何反向调用Android本地方法。 首先,让我们从Android调用JavaScript的方法开始。Android中的WebView组件是实现这种交互的主要工具。当在...

    JS和Android本地方法之间的调用

    为了实现这种交互,开发者通常需要理解JS与Android本地方法之间的调用机制。本篇将深入探讨这个主题,帮助你更好地理解和实践这两种技术的融合。 一、JavaScript与Android交互基础 1. Webview:Android中的WebView...

    Java本地调用接口 JNative

    Java本地调用接口(Java Native Interface,简称JNI)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都扮演着关键角色,比如当需要访问操作系统特定功能、优化性能或者利用已...

    chrome 调用本地exe

    注,chrome 通过注册表注册表 只能调用本地的 exe 或者bat文件,不能调用 ppt word 这样的问题,所以我用VB 写了一个exe 可以接收调用参数,这样只许注册一次就可以通过传参打开所有课执行文件了 由于1.exe是后台...

    java调用本地打印机

    在Java编程环境中,调用本地打印机是一项常见的任务,特别是在企业级应用中,如报表生成、文档打印等场景。本文将详细讲解如何利用Java API来实现这一功能,以及可能遇到的问题和解决方案。 首先,Java提供了`java....

    jni本地调用4

    在"JNI本地调用4"这个主题中,我们将深入探讨JNI的使用,特别是在执行本地方法和实现Java与C/C++代码集成时的关键知识点。 1. **JNI概述**:JNI是一个接口,提供了一套API,使得Java开发者可以编写本地方法来调用非...

    web调用本地程序示例

    在IT领域,Web调用本地程序是一种常见的技术需求,它允许网页通过某种方式与用户的本地计算机进行交互,执行特定的任务。这种技术广泛应用于自动化工作流程、远程服务支持、软件更新等场景。本示例提供了实现这一...

    远程方法调用(客户端调用服务端的方法)源码

    这种技术使得分布式计算成为可能,使得开发者可以构建分布式应用程序,使得客户端能够像调用本地对象一样调用远端服务器上的对象。 在RMI中,主要涉及以下几个核心概念: 1. **远程接口(Remote Interface)**:这...

    Android-一个让http接口调用跟调用本地方法一样自然优雅的项目

    标题提到的“Android-一个让http接口调用跟调用本地方法一样自然优雅的项目”正是为了解决这个问题,它旨在通过自动化的方式使得HTTP接口调用变得更为简洁、直观。 该项目的核心思想是将HTTP API与接口绑定,这样...

    RMI远程方法调用RMI远程方法调用

    RMI的核心理念是让开发者能够像调用本地方法一样调用远程对象的方法,简化了分布式系统的设计和实现。 **什么是RMI** RMI(Remote Method Invocation)是一种Java技术,它提供了在不同网络节点上的Java虚拟机之间...

    js调用android本地方法的实现

    JS调用Android本地方法能够利用Web技术的灵活性和原生功能的强大性,为用户提供更好的体验。本篇文章将详细介绍如何在JS通过WebView调用Android的本地方法,同时规避`addJavascriptInterface`的安全问题。 首先,...

    windows下浏览器调用本地应用程序

    总的来说,Windows下浏览器调用本地应用程序的方法包括使用ActiveXObject(仅限IE)、创建.url快捷方式和注册自定义URL协议等。需要注意的是,这些方法都涉及对用户计算机的访问,因此在实际应用中必须谨慎处理,以...

    java调用c代码:AVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式 )。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法

    JNI(Java Native Interface)就是为了弥补这一不足,它允许Java代码调用本地方法,这些方法通常以库文件的形式存在,如Windows上的DLL(Dynamic Link Library)或UNIX上的SO(Shared Object)文件。通过JNI,Java...

    使用Python调用微信本地ocr服务.zip

    使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip...

    java远程方法调用

    - 性能开销:远程调用涉及序列化、网络传输等操作,性能不如本地调用。 - 复杂性:实现和维护较为复杂,尤其是处理异常情况时。 #### 六、总结 RMI为Java开发者提供了一种强大的工具,用于构建分布式应用。理解RMI...

    通过Java调用本地方法.pdf

    "Java调用本地方法详细指南" Java Native Interface(JNI)是Java开发中的一种技术,允许Java代码调用本地方法,从而与其他语言编写的应用程序和库进行交互。JNI是Java Development Kit(JDK)的组成部分,已经被...

Global site tag (gtag.js) - Google Analytics