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

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

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

初始化虚拟机

本地代码在调用Java方法之前必须先加载Java虚拟机,而后所有的Java程序都在虚拟机中执行。为了初始化Java虚拟机,JNI提供了一系列的接口函数Invocation API。通过这些API可以很方便地将虚拟机加载到内存中。

创建虚拟机可以用函数



















jint JNI_CreateJavaVM
(JavaVM **pvm, 
void **penv, void *args)

对于这个函数有一点需要注意的是,在JDK 1.1中第三个参数总是指向一个结构JDK1_ 1InitArgs, 这个结构无法完全在所有版本的虚拟机中进行无缝移植。在JDK 1.2中已经使用了一个标准的初始化结构JavaVMInitArgs来替代JDK1_1InitArgs。下面我们分别给出两种不同版本的示例代码。

在JDK 1.1初始化虚拟机:

#include <jni.h>
  int main() {
  JNIEnv *env;
  JavaVM *jvm;
  JDK1_1InitArgs vm_args;
  jint res;
/* IMPORTANT: 版本号设置一定不能漏 */
  vm_args.version = 0x00010001;
/*获取缺省的虚拟机初始化参数*/
  JNI_GetDefaultJavaVMInitArgs
(&vm_args);
  /* 添加自定义的类路径 */
  sprintf(classpath,
"%s%c%s",
  vm_args.classpath,
PATH_SEPARATOR, USER_CLASSPATH);
  vm_args.classpath = classpath;
  /*设置一些其他的初始化参数*/
  /* 创建虚拟机 */
  res = JNI_CreateJavaVM
(&jvm,&env,&vm_args);
  if (res < 0) {
   fprintf(stderr, 
"Can't create Java VM\n");
   exit(1);
  }
  /*释放虚拟机资源*/
  (*jvm)->DestroyJavaVM(jvm);
  }
  JDK 1.2初始化虚拟机:
  /* invoke2.c */
  #include <jni.h>
  int main() {
  int res;
  JavaVM *jvm;
  JNIEnv *env;
  JavaVMInitArgs vm_args;
  JavaVMOption options[3];
  vm_args.version=JNI_VERSION_1_2;
//这个字段必须设置为该值
  /*设置初始化参数*/
  options[0].optionString
= "-Djava.compiler=NONE";
  options[1].optionString 
= "-Djava.class.path=.";
  options[2].optionString
= "-verbose:jni";
//用于跟踪运行时的信息
  /*版本号设置不能漏*/
  vm_args.version = JNI_VERSION_1_2;
  vm_args.nOptions = 3;
  vm_args.options = options;
  vm_args.ignoreUnrecognized
= JNI_TRUE;
  res = JNI_CreateJavaVM(&jvm, 
(void**)&env, &vm_args);
  if (res < 0)
{
   fprintf(stderr,
"Can't create Java VM\n");
   exit(1);
  }
  (*jvm)->DestroyJavaVM(jvm);
  fprintf(stdout,
"Java VM destory.\n");
  }

为了保证JNI代码的可移植性,建议使用JDK 1.2的方法来创建虚拟机。JNI_CreateJavaVM函数的第二个参数JNIEnv *env,就是贯穿整个JNI始末的一个参数,因为几乎所有的函数都要求一个参数就是JNIEnv *env。

访问类方法

初始化了Java虚拟机后,就可以开始调用Java的方法。要调用一个Java对象的方法必须经过几个步骤:

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

有两种途径来获取对象的类定义:第一种是在已知类名的情况下使用FindClass来查找对应的类。但是要注意类名并不同于平时写的Java代码,例如要得到类jni.test.Demo的定义必须调用如下代码:

jclass cls = (*env)->FindClass(env,
"jni/test/Demo");
//把点号换成斜杠

然后通过对象直接得到其所对应的类定义:

jclass cls = (*env)-> 
GetObjectClass(env, obj);
//其中obj是要引用的对象,
类型是jobject

2.读取要调用方法的定义(jmethodID)

我们先来看看JNI中获取方法定义的函数:

jmethodID (JNICALL *GetMethodID)
(JNIEnv *env, jclass clazz, 
const char *name,
  const char *sig);
jmethodID (JNICALL *GetStaticMethodID)
(JNIEnv *env,
jclass class, const char
  *name, const char *sig);

<<上一页 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技术 信息化
专题:谷歌发布PC操作系统Chrome OS
·芯能量 新动力 兴经济:..
·专题:英特尔与AMD和解 ..
·专题:惠普27亿收购3Com..
专题:
·专题:诺基亚危局已现 ..
·六股势力角逐4G标准 中..
·专题:联通iPhone并不贵..
 
·惠普123459黑白激打家族..
·云计算格局初现 三大阵..
·分析:虚拟化在高性能计..
2009 IBM动态架构新动力论坛
·直播:第八届中国系统与..
·专题:置身智慧海洋——..
·专题:让物品开口说话 ..