CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
【经验总结】不能实施并行处理的情况 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

关于jdk1.4里面的jvm.dll,找不到,怎么办?谁知道怎么在C中调用Java方法?

楼主hdmykun(心铃儿动)2005-04-05 12:29:11 在 Java / J2SE / 基础类 提问

JNI允许运行在虚拟机的Java程序能够与其它语言(例如C和C++)编写的程序或者类库进行相互间的调用。  
   
  我想在C/C++中调用Java方法,是用JDK1.4.2,以及Visual   C++   6。按照步骤一步步都做好了,其中有一步是在C里面初始化java虚拟机,就是需要jvm.dll,照介绍的路径jvm.dll   应该是  
  [JDK目录]\bin\classic里面。  
   
  可是,\bin下根本就没有\classic!所以也就没有jvm.dll。  
   
  然后搜索发现,在[JDK目录]\jre\bin\下有两个目录:……\client和……\server,他们下面分别有一个jvm.dll,就把它们分别试了一下可惜都不行,教教我该怎么做呀!! 问题点数:50、回复次数:16Top

1 楼hdmykun(心铃儿动)回复于 2005-04-05 12:52:37 得分 0

谁知道怎么在C中调用Java方法?  
   
  不知道哪里出的问题?Top

2 楼jFresH_MaN(十一月的萧邦-夜曲)回复于 2005-04-05 13:04:40 得分 1

你的path环境变量是怎么设的?  
  我从没碰到过这个问题Top

3 楼taolei(实在无聊)回复于 2005-04-05 13:54:43 得分 10

运行环境的机器上必须已经正确安装了jre  
   
  在注册表里找  
  HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java   Runtime   Environment  
  取得CurrentVersion的值,假设是1.4  
   
  在到HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java   Runtime   Environment\1.4下  
  取得RuntimeLib的值,就是jvm.dll的路径。Top

4 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-05 14:16:38 得分 2

是否正确安装JRETop

5 楼hdmykun(心铃儿动)回复于 2005-04-05 14:46:03 得分 0

原来环境变量设置应该没有问题,从Java调用C就可以,不知道为什么C调用java就不行。  
   
  这是最初的Path环境变量,PATH=%JAVA_HOME%\bin;C:\Inprise\vbroker\bin;…………  
  后来改成PATH=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin\client;C:\Inprise\vbroker\bin;…………  
  因为%JAVA_HOME%\jre\bin\client下面有jvm.dll,  
  可是都不行  
   
  刚才照“实在无聊”的方法改成PATH=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin\client\jvm.dll;C:\Inprise\vbroker\bin;…………  
   
  结果,刚才的问题没有了,但是屏幕上出来好多这样的:  
  [Dynamic-linking   native   method   java.lang.StrictMath.pow   ...   JNI]  
  [Dynamic-linking   native   method   java.lang.Float.intBitsToFloat   ...   JNI]  
  [Dynamic-linking   native   method   java.lang.Double.longBitsToDouble   ...   JNI]  
  [Dynamic-linking   native   method   java.lang.Float.floatToIntBits   ...   JNI]  
  [Dynamic-linking   native   method   java.lang.Double.doubleToLongBits   ...   JNI]  
  [Dynamic-linking   native   method   java.lang.Object.registerNatives   ...   JNI]  
  [Registering   JNI   native   method   java.lang.Object.hashCode]  
  [Registering   JNI   native   method   java.lang.Object.wait]  
  …………  
  很多,没有运行出来结果  
   
  调用的那个Java方法本身是可以正确运行的Top

6 楼bigc2000(公元2005年4月9日)回复于 2005-04-05 14:57:32 得分 10

把代码贴出来看看,  
  jvm.dll     有client,也有server,  
  显示为classic是运行的好像比较早的版本,如你用java运行一个程序就可以加上一个classic参数  
  一般只需要用加载jre/bin/clinet/jvm.dll。  
   
  编译的时候需要使用到     lib/jvm.lib   这个库。否则可能会出错。  
   
  至于运行时,把你调用上层的   .class   ,或者.jar放到jre/lib/ext下就可以了。  
  Top

7 楼hdmykun(心铃儿动)回复于 2005-04-05 15:19:40 得分 0

#include   <jni.h>  
  #include   <stdio.h>  
  #include   <stdlib.h>  
   
  void   main(){  
  JavaVM   *jvm;  
  JNIEnv   *env;  
  JavaVMInitArgs   vm_args;  
   
  int   res;  
   
  vm_args.version   =   JNI_VERSION_1_4;  
   
  //vm_args.nOptions   =   4;  
  //JavaVMOption   options[4];  
  //这里,有的介绍设的值是2,有3也有4,下面用的是3  
   
  JavaVMOption   options[3];  
  vm_args.nOptions   =   3;  
   
  options[0].optionString   =   "-verbose:jni";  
  options[1].optionString   =   "-Djava.class.path=.";  
  options[2].optionString   =   "-Djava.compiler=NONE";  
  //options[2].optionString   =   "-Djava.library.path=.";    
   
  vm_args.ignoreUnrecognized   =   JNI_TRUE;  
  vm_args.options   =   options;  
   
  //jint   result   =   JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);  
  res   =   JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);  
   
  if(res<0){  
  fprintf(stderr,"can't   creat   Java   VM");  
  exit(1);  
  }  
  jclass   mainClass   =   env->FindClass("NativeTest");  
  jmethodID   method   =   env->GetStaticMethodID(mainClass,"main","([Ljava/lang/String;)V");  
  jclass   stringClass   =   env->FindClass("java/lang/String");  
  jobjectArray   args   =   env->NewObjectArray(0,stringClass,NULL);  
  env->CallStaticVoidMethod(mainClass,method,args);  
   
  jvm->DestroyJavaVM();  
  fprintf(stdout,"Java   VM   destory");  
  }Top

8 楼hdmykun(心铃儿动)回复于 2005-04-05 15:26:59 得分 0

上面是C的代码,另外在   Tool>>Options>>里面设置了:  
  1.Include   files的路径,包括  
      D:\j2sdk\include\win32  
      D:\j2sdk\include  
      还有C程序和Java方法所在的目录(它们在同一个目录下)  
  2.Library   files路径,包括  
      D:\j2sdk\libTop

9 楼hdmykun(心铃儿动)回复于 2005-04-05 15:28:58 得分 0

//这是我的简单的Java方法:NativeTest  
   
  public   class   NativeTest{  
      public   static   void   main(String[]   args){  
          NativeTest   nt=new   NativeTest();  
      }  
      public   NativeTest(){  
          System.out.println("Hello,Maggie!!!");  
      }  
  }  
   
  这个没有问题吧Top

10 楼taolei(实在无聊)回复于 2005-04-05 19:38:57 得分 9

不要设置path,用我刚才告诉你的方法,用LoadLibrary函数动态装载jvm.dll,这是最好的方法。  
   
  你刚才那个设置path的,程序没错,只是path设置的不正确,装载入了不正确的jvm.dll.你应该是用jvm.lib静态连接的程序,这样在所有的运行环境里都要正确的设置path,不建议这样。Top

11 楼hdmykun(心铃儿动)回复于 2005-04-05 21:17:00 得分 0

C中怎么用LoadLibrary函数动态装载jvm.dll?语句  
   
  我是在VC中的选项“工程>>设置”>>link里面设置的D:\j2sdk\lib\jvm.libTop

12 楼taolei(实在无聊)回复于 2005-04-06 12:55:34 得分 8

#include   <jni.h>  
  #include   <crtdbg.h>  
  #define   JNI_VERSION JNI_VERSION_1_2  
  typedef   JNIIMPORT   jint    
  (JNICALL   *P_CreateJavaVM) (JavaVM   **pvm,   void   **penv,   void   *args);  
  BOOL   CreateJavaVM(JavaVM**   pjvm,JNIEnv**   penv,int   optionCount,const   char*   options[])  
  {  
  HKEY   hKey;  
  LONG   r   =   ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,  
  "SOFTWARE\\JavaSoft\\Java   Runtime   Environment",  
  NULL,KEY_READ,&hKey);  
  if   (r   !=   ERROR_SUCCESS)  
  {  
  return   FALSE;  
  }  
  char   jvmPath[512];  
  DWORD   cbr;  
  DWORD   type;  
  cbr   =   sizeof(jvmPath);  
  r   =   ::RegQueryValueEx(hKey,"CurrentVersion",NULL,&type,(LPBYTE)jvmPath,&cbr);  
  if   (r   !=   ERROR_SUCCESS)  
  {  
  ::RegCloseKey(hKey);  
  return   FALSE;  
  }  
  jvmPath[cbr]   =   NULL;  
  HKEY   hKey2;  
  r   =   ::RegOpenKeyEx(hKey,jvmPath,NULL,KEY_READ,&hKey2);  
  if   (r   !=   ERROR_SUCCESS)  
  {  
  ::RegCloseKey(hKey);  
  return   FALSE;  
  }  
  cbr   =   sizeof(jvmPath);  
  r   =   ::RegQueryValueEx(hKey2,"RuntimeLib",NULL,&type,(LPBYTE)jvmPath,&cbr);  
  ::RegCloseKey(hKey);  
  ::RegCloseKey(hKey2);  
  if   (r   !=   ERROR_SUCCESS)  
  return   FALSE;  
  HMODULE   h   =   ::LoadLibrary(jvmPath);  
  if   (h   ==   NULL)  
  return   FALSE;  
  P_CreateJavaVM   procJvm   =   (P_CreateJavaVM)::GetProcAddress(h,"JNI_CreateJavaVM");  
  _ASSERT(procJvm   !=   NULL);  
  if   (procJvm   ==   NULL)  
  return   FALSE;  
   
  JavaVM*   jvm=NULL;  
  JNIEnv*   env=NULL;  
  JavaVMInitArgs   vm_args;  
  ZeroMemory(&vm_args,sizeof(JavaVMInitArgs));  
  vm_args.version   =   JNI_VERSION;  
  vm_args.nOptions   =   optionCount;  
  if   (optionCount   >   0)  
  {  
  vm_args.options   =   new   JavaVMOption[optionCount];  
  for(int   i=0;i<optionCount;i++)  
  {  
  vm_args.options[i].optionString   =   (char*)options[i];  
  }  
  }  
   
  r   =   procJvm(&jvm,(void**)&env,&vm_args);  
  if   (optionCount   >   0)  
  delete   []   vm_args.options;  
  if   (r   !=   0)  
  return   FALSE;  
  if   (pjvm   !=   NULL)  
  *pjvm   =   jvm;  
  if   (penv   !=   NULL)  
  *penv   =   env;  
  return   TRUE;  
  }  
   
   
   
  Top

13 楼bigc2000(公元2005年4月9日)回复于 2005-04-06 13:06:55 得分 5

vm_args.nOptions   =   3;  
  必须是2以后的,应该最好用4,因为你的是1.4.2  
   
  LoadLibrary("D:\\jsdk\\jre\\bin\\jvm.dll");设置相应的你需要加载的dll即可  
   
  但必须注意要把   jvm.lib   添加到工程配置中(你的配置中已经加了)  
  或者在代码中使用  
  #param   commment(lib,"相应路径\\jvm.lib")  
   
  回复人:   taolei(实在无聊)   (   )   信誉:100    
  按照他说的就可以了,不过我觉得没有必要去查注册表,使用相对路径是最好了  
   
  Top

14 楼hdmykun(心铃儿动)回复于 2005-04-06 14:52:25 得分 0

能不能给一个使用LoadLibrary()的例子,我试了几次总是问题越来越多,呵呵,麻烦你们了Top

15 楼yuziyu(yuziyu)回复于 2005-04-10 13:42:10 得分 5

\j2sdk1.4.2\jre\bin\client\jvm.dllTop

16 楼hdmykun(心铃儿动)回复于 2005-05-08 20:58:19 得分 0

的确是用这个驱动路径:\j2sdk1.4.2\jre\bin\client\jvm.dll  
  :)  
  我找到我的问题了,调用的JAVA方法的路径问题!Top

相关问题

  • vb调用C写的DLL
  • C#调用DLL的问题
  • C#调用Dll的问题
  • C#调用DLL的问题
  • c++如何调用c写的dll??
  • vb.net 怎样调用delphi dll (这个dll C#可以调用的)
  • delphi调用c的dll问题,急!!!
  • 简单调用DLL函数C++ Builder !
  • java中如何调用c写的dll?
  • VB中能调用C#写的DLL吗?

关键词

  • jvm
  • vm
  • inprise
  • 调用
  • jvmpath
  • jni
  • nativetest
  • 路径
  • penv
  • j2sdk

得分解答快速导航

  • 帖主:hdmykun
  • jFresH_MaN
  • taolei
  • oyljerry
  • bigc2000
  • taolei
  • taolei
  • bigc2000
  • yuziyu

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
CSDN网站24小时值班电话:13552009689
Copyright © 2000-2009, CSDN.NET, All Rights Reserved
GongshangLogo