· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [专题] IBM Rational高峰论坛 Windows 7十大功能
· [专题] 史上就危险7月 微软 BizSpark 计划介绍
· [IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 我也能做CTO_赛迪连载 赛迪七夕特别行动
· [热点] Chrome 4.0采用V8引擎 Java开发编程规范

讲解如何在C/C++中调用Java的方法 (3)

发布时间:2005.04.13 17:25     来源:ChinaITLab    作者:ChinaITLab

这两个函数的区别在于GetStaticMethodID是用来获取静态方法的定义,GetMethodID则是获取非静态的方法定义。这两个函数都需要提供四个参数:env就是初始化虚拟机得到的JNI环境;第二个参数class是对象的类定义,也就是第一步得到的obj;第三个参数是方法名称;最重要的是第四个参数,这个参数是方法的定义。

因为我们知道Java中允许方法的多态,仅仅是通过方法名并没有办法定位到一个具体的方法,因此需要第四个参数来指定方法的具体定义。但是怎么利用一个字符串来表示方法的具体定义呢?JDK中已经准备好一个反编译工具javap,通过这个工具就可以得到类中每个属性、方法的定义。下面就来看看jni.test.Demo的定义:

打开命令行窗口并运行 javap -s -p jni.test.Demo 得到运行结果如下:











Compiled from Demo.java
  public class jni.test.Demo
extends java.lang.Object
{
  public static int COUNT;
  /* I */
  public java.lang.String msg;
  /* Ljava/lang/String; 
*/
  private int counts[];
  /* [I */
  public jni.test.Demo();
  /* ()V */
  public jni.test.Demo
(java.lang.String);
  /* (Ljava/lang/String;)V */
  public java.lang.String getMessage();
  /* ()Ljava/lang/String; */
  public int getCounts()[];
  /* ()[I */
  public void setCounts(int[]);
  /* ([I)V */
  public void throwExcp() throws
java.lang.IllegalAccessException;
  /* ()V */
  static {};
  /* ()V */
  }

我们看到类中每个属性和方法下面都有一段注释。注释中不包含空格的内容就是第四个参数要填的内容(关于javap具体参数请查询JDK的使用帮助)。下面这段代码演示如何访问jni.test.Demo的getMessage方法:

/*
 假设我们已经有一个
jni.test.Demo的实例obj
  */
  jmethodID mid;
  jclass cls = 
(*env)-> GetObjectClass (env, obj);
//获取实例的类定义
  mid=(*env)->GetMethodID
(env,cls,"getMessage"," 
()Ljava/lang/String;
");
/*如果mid为0表示获取方法定义失败*/
jstring msg = (*env)-> 
CallObjectMethod(env, obj, mid);
/*
 如果该方法是静态的方法那只需要将
最后一句代码改为以下写法即可:
  jstring msg = (*env)-> 
CallStaticObjectMethod
(env, cls, mid);
  */

3.调用方法

为了调用对象的某个方法,可以使用函数CallMethod或者CallStaticMethod(访问类的静态方法),根据不同的返回类型而定。这些方法都是使用可变参数的定义,如果访问某个方法需要参数时,只需要把所有参数按照顺序填写到方法中就可以。在讲到构造函数的访问时,将演示如何访问带参数的构造函数。

访问类属性

访问类的属性与访问类的方法大体上是一致的,只不过是把方法变成属性而已。

1.获取指定对象的类(jclass)

这一步与访问类方法的第一步完全相同,具体使用参看访问类方法的第一步。

2.读取类属性的定义(jfieldID)

在JNI中是这样定义获取类属性的方法的:

jfieldID 
(JNICALL *GetFieldID)
(JNIEnv *env, jclass clazz,
const char *name, const char *sig);
jfieldID (JNICALL *GetStaticFieldID)
(JNIEnv *env, jclass clazz, 
const char *name, const char *sig);

这两个函数中第一个参数为JNI环境;clazz为类的定义;name为属性名称;第四个参数同样是为了表达属性的类型。前面我们使用javap工具获取类的详细定义的时候有这样两行:

public java.lang.String msg;
/* Ljava/lang/String; */

其中第二行注释的内容就是第四个参数要填的信息,这跟访问类方法时是相同的。

<<上一页 1 2 3 4 5 下一页>>


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· Java语言入门级的十二大特色详细介绍 (04-13) · Java初学者常用开发工具介绍图解 (04-13)
· JAVA程序的反编译 再次掀起编译热潮 (04-12) · 教您怎样部署基于WebSphere的J2EE应用 (04-12)
· 第三次世界大战:论Java世界的分裂 (04-12) · Java开发为什么需要UML?你知道么 (04-12)
· FlashLite与J2ME的全方位分析比较 (04-12) · FlashLite与J2ME的全方位分析比较 (04-12)
· J2ME入门专题系列之三:搭建开发环境 (04-12) · 从C++到Java——理解面向对象的关键所在 (04-12)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
专题:扭亏为盈 联想09年Q2翻番
·专题:Tech·Ed 2009微..
·直播:2009互联网大会..
·迅雷搜狐"互搏" 谁动了..
专题:诺基亚危局已现 或重蹈摩托覆辙
·六股势力角逐4G标准 中..
·专题:联通iPhone并不贵..
·专题:排排坐开商店 三..
商务演示需求分析 多媒体会议室必备投影
·VMware在京隆重举行2009..
·专题:笔记本频道10月热..
·专题:学生机市场 惠普 ..
专题:Tech.Ed 2009微软技术大会
·专题:2009 SYBASE 亚太..
·专题:微软新一代桌面操..
·专题:2009年第3届CSDN..