免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3336 | 回复: 7
打印 上一主题 下一主题

[C] 请教一个在C语言中创建java 虚拟机的奇怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-20 11:19 |只看该作者 |倒序浏览
我有以下一段简单测试代码:

  1. #include <jni.h>;
  2. #include <stdio.h>;
  3. #define USER_PATH ".:$JAVAHOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"

  4. int main() {
  5.         JNIEnv *penv;
  6.         JavaVM *pjvm;
  7.         JDK1_1InitArgs vm_args;
  8.         jint res;
  9.         jclass cls;
  10.         jmethodID mid;
  11.         char classpath[1024];
  12.        
  13.         vm_args.version = JNI_VERSION_1_2;
  14.        
  15.         res=JNI_GetDefaultJavaVMInitArgs(&vm_args);
  16.         if(vm_args.classpath!=NULL)
  17.                 sprintf(classpath,"%s:%s",vm_args.classpath,USER_PATH);
  18.         else
  19.                 sprintf(classpath,"%s",USER_PATH);
  20.         vm_args.classpath = classpath;
  21.        
  22.         res = JNI_CreateJavaVM(&pjvm,(void*)(&penv),&vm_args);
  23.         if (res < 0) {
  24.                 fprintf(stdout, "Can't create Java VM\n");
  25.                 exit(1);
  26.         }
  27.        
  28.         (*pjvm)->;DestroyJavaVM(pjvm);
  29.        
  30. }
复制代码


编译通过,但是在执行JNI_CreateJavaVM这个函数时就产生Segmentation Fault错误,百思不得其解。这个程序是我从网上的例子中摘出来的,应该不会有错误的,望高手指教。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-05-20 13:16 |只看该作者

请教一个在C语言中创建java 虚拟机的奇怪问题

res = JNI_CreateJavaVM(&pjvm,(void*)(&penv),&vm_args);

找到如下API的原型和调用说明,估计你传入的参数类型或者大小等有问题。
JNI_CreateJavaVM

论坛徽章:
0
3 [报告]
发表于 2003-05-20 14:25 |只看该作者

请教一个在C语言中创建java 虚拟机的奇怪问题

以下是我查阅函数原型声明后重新写得,但是还是那个错误
Segmentation Fault
请键盘兄解答


  1. #include <jni.h>;
  2. #include <stdio.h>;
  3. #define USER_PATH ".:$JAVAHOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"

  4. int main() {
  5.    JNIEnv *penv;
  6.    JavaVM *pjvm;
  7.    JDK1_1InitArgs vm_args;
  8.    jint res;
  9.    jclass cls;
  10.    jmethodID mid;
  11.    char classpath[1024];
  12.    
  13.    vm_args.version = JNI_VERSION_1_2;
  14.    
  15.    res=JNI_GetDefaultJavaVMInitArgs(&vm_args);
  16.    if(vm_args.classpath!=NULL)
  17.       sprintf(classpath,"%s:%s",vm_args.classpath,USER_PATH);
  18.    else
  19.       sprintf(classpath,"%s",USER_PATH);
  20.    vm_args.classpath = classpath;
  21.    
  22.    res = JNI_CreateJavaVM(&pjvm,&penv,&vm_args);
  23.    if (res < 0) {
  24.       fprintf(stdout, "Can't create Java VM\n");
  25.       exit(1);
  26.    }
  27.    
  28.    (*pjvm)->;DestroyJavaVM(pjvm);
  29.    
  30. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-05-20 19:02 |只看该作者

请教一个在C语言中创建java 虚拟机的奇怪问题

res = JNI_CreateJavaVM(&pjvm,(void*)(&penv),&vm_args);

以下是我查阅函数原型声明后重新写得,但是还是那个错误
res = JNI_CreateJavaVM(&pjvm,&penv,&vm_args);

只有你才能知道函数JNI_CreateJavaVM的原型是怎么定义的。你不给我原型说明。让我猜吗?呵呵

论坛徽章:
0
5 [报告]
发表于 2003-05-21 09:34 |只看该作者

请教一个在C语言中创建java 虚拟机的奇怪问题

键盘兄,是这样的,JNI_CreateJavaVM(&pjvm,&penv,&vm_args);
这个函数是JDK里面的标准函数,不是我自己定义的。如果你安装了JDK,那么你会在jni.h中找到这个函数的定义。另外,我昨天又查阅了一些相关的资料。我上面的那种写法是针对于java1.1标准的,我们现在用到的java版本都是JDK1.2以上的,他们都是java2,也就是java1.2标准的。

针对java1.2标准,有一种全新的不同的写法,如下:

  1. #include <jni.h>;
  2. #include <stdio.h>;
  3. #define USER_PATH ".:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
  4. #define TRUE 1

  5. int main() {
  6.         JNIEnv *env;
  7.         JavaVM *vm;
  8.         jint res;
  9.         jclass cls;
  10.         JavaVMInitArgs vm_args;
  11.         JavaVMOption options[4];
  12.         char classpath[1024];

  13.         sprintf(classpath,"-Djava.class.path=%s",USER_PATH);
  14.         options[0].optionString = "-Djava.compiler=NONE";           /* disable JIT */
  15.         options[1].optionString = classpath;                                                 /* user classes */
  16.         options[2].optionString = "-Djava.library.path=$JAVA_HOME/lib";  /* set native library path */
  17.         options[3].optionString = "-verbose:jni";                   /* print JNI-related messages */

  18.         vm_args.version = JNI_VERSION_1_2;
  19.         vm_args.options = options;
  20.         vm_args.nOptions = 4;
  21.         vm_args.ignoreUnrecognized = TRUE;

  22.         /* Note that in JDK 1.2, there is no longer any need to call
  23.         * JNI_GetDefaultJavaVMInitArgs.
  24.         */
  25.         res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);

  26.         printf("res=%d\n",res);
  27.        
  28.        
  29.         (*vm)->;DestroyJavaVM(vm);
  30.        
  31. }
复制代码


但是不幸的很,运行后还是那个错误。

我的操作系统是solaris9,JDK版本为1.3.1
编译器为gcc-2.95.3
编译命令为:
gcc -o test.jvm.1 test.jvm.1.c -I$JAVA_HOME/include -I$JAVA_HOME/include/solaris \
-L$JAVA_HOME/jre/lib/i386 -ljvm

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2003-05-21 12:53 |只看该作者

请教一个在C语言中创建java 虚拟机的奇怪问题

用这个试试看


  1. #include <jni.h>;

  2. #ifdef _WIN32
  3. #define PATH_SEPARATOR ';'
  4. #else
  5. #define PATH_SEPARATOR ':'
  6. #endif

  7. int main()
  8. {
  9.           JavaVMOption options[1];
  10.           JNIEnv *env;
  11.           JavaVM *jvm;
  12.           JavaVMInitArgs vm_args;
  13.           long status;
  14.           jclass cls;
  15.           jmethodID mid;
  16.           jint square;
  17.           jboolean not;

  18.           options[0].optionString = "-Djava.class.path=.";
  19.           memset(&vm_args, 0, sizeof(vm_args));
  20.           vm_args.version = JNI_VERSION_1_2;
  21.           vm_args.nOptions = 1;
  22.           vm_args.options = options;
  23.           status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

  24.           if (status != JNI_ERR)
  25.     {
  26.             cls = (*env)->;FindClass(env, "Sample2");
  27.             if(cls !=0)
  28. {   mid = (*env)->;GetStaticMethodID(env, cls, "intMethod", "(I)I");
  29.                 if(mid !=0)
  30.                 {  square = (*env)->;CallStaticIntMethod(env, cls, mid, 5);
  31.                        printf("Result of intMethod: %d\n", square);
  32.                 }

  33.                 mid = (*env)->;GetStaticMethodID(env, cls, "booleanMethod", "(Z)Z");
  34.                 if(mid !=0)
  35.                 {  not = (*env)->;CallStaticBooleanMethod(env, cls, mid, 1);
  36.                        printf("Result of booleanMethod: %d\n", not);
  37.                 }
  38. }

  39.             (*jvm)->;DestroyJavaVM(jvm);
  40. return 0;
  41. }
  42.           else
  43.             return -1;
  44. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2003-05-21 13:27 |只看该作者

请教一个在C语言中创建java 虚拟机的奇怪问题

不行,还是Segmentation Fault

论坛徽章:
0
8 [报告]
发表于 2003-05-21 13:30 |只看该作者

请教一个在C语言中创建java 虚拟机的奇怪问题

不行,还是Segmentation Fault
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP