上面调下面的方法,下面访问上面的变量,还有编码签名,还差什么?好吧,还差下面掉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或者不加)。
这种方法可以调用指定类中的指定版本的方法,而不需要动态调度。
分享到:
相关推荐
调用iphlpapi获得本地ip信息,C++源代码演示获取ip信息的全过程。
通过本地方法调用来调用C语言的例子,一个调用时间的,谨供参考
Android中调用js方法及js中调用本地方法,简单明了
注,chrome 通过注册表注册表 只能调用本地的 exe 或者bat文件,不能调用 ppt word 这样的问题,所以我用VB 写了一个exe 可以接收调用参数,这样只许注册一次就可以通过传参打开所有课执行文件了 由于1.exe是后台...
JS和Android本地方法之间的调用
【方法】html调用本地python程序进行交互 前后端交互
java调用本地打印机java调用本地打印机java调用本地打印机java调用本地打印机
web调用本地应用程序
js通过webview调用android的本地方法,避免addJavascriptInterface问题
H5调用本地摄像头实现扫一扫的功能实现。
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式 )。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各...
jni本地调用4
delphi编程实现调用本地程序,本实例可调用本地 截图工具、步骤记录器、画图工具、计算器、记事本、屏幕键盘、放大镜、任务管理器、命令提示符、控制面板、word和excel,用的是WinExec和ShellExecute方法,需要实现...
借助WebSocket完成Android本地代码调用JavaScript代码的插件,并且可以获得返回值
该文档详细介绍了在Java代码中如何调用C或C++代码。主要思想是:将C或C++代码大包成动态链接库,然后共Java代码在执行时调用。
本身也是作为课程设计的作业而用,本文件为html5调用本地媒体文件和设备, 代码东挪西凑来的,风格有点不一样,有动作层js也有jquery,界面可是原创的,不过界面还有一点点不明原因的小毛病,不影响正常使用。 参考...
本地摄像头调用api
1、Dubbo 远程调用实现 2、内带zookeeper-3.4.5消息服务 3、直接导入myeclipse运行:dubbo-server导入tomcat中运行 4、dubbo-client 运行测试类/dubbo-client/src/com/fengjx/main/Consumer.java