分享

JNI攻略之十――操作Java虚拟机

 lifei_szdz 2012-12-08

JNI攻略之十――操作Java虚拟机  

2006-12-19 17:05:09|  分类: JNI |字号 订阅

 

JNI攻略之十――操作Java虚拟机

       江苏 无锡 缪小东

       本篇和大家讲述一个比较高级的JNI的应用!主要讲述在CC++中启动虚拟机!

 

一、启动虚拟机的C文件

//下面是启动JDK1.2后的虚拟机的c代码!JDK1.2后的虚拟机和之前的是不太相同的

//由于现在我们使用的虚拟机一般都是1.4甚至更高,所以我们使用1.2以上的虚拟机

/* invoke1.2.c */

#include <stdio.h>

#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 VMn");                                  //输出错误

       //exit(1);

 }  

 (*jvm)->DestroyJavaVM(jvm);                                                    //释放虚拟机

 fprintf(stdout, "Java VM destory.n");                              //输出“虚拟机释放”信息

 

}

 

       从上面的代码可以看出――虚拟机的启动有三步:1.甚至启动参数;2.启动虚拟机;3.释放虚拟机相关的资源。

 

二、可能错误及其解决办法(3个最常见的错误)

       首先,与前面所有JNI本地方法不同的是,我们在此使用VC工具的“新建”,选择“工程”选项卡,继续选择“Win32 Application(不是前面的“Win32 Dynamic-Link Library”,这主要是因为我们现在不是生成一个供Java使用的DLL文件,而是一个可以独立运行的EXE文件)。下面一路点击。

 

其次,在编译通过后,连接时可能会出现下面的错误。(看到了吧!――在VC工具的最下面)下面的图给出了修改办法――依次点击“工程”、“设置”、“连接”,到最下面的“工程 选项”中将“subsystem:windows”改为“subsystem:console”就可以解决这个问题了!(为什么!你不要问我哦!我会Java,可不是VCC高手哦!)

 

 

       下图就是更改的图示!

 

 

最后,当你编译、连接了你的“.c”文件产生一个“.exe”文件时,你去点击,就应该有输出!此时可能跳出错误提示“不能连接jvm.dll”之类的对话框,请将“Java\jdk1.6.0\jre\bin\client “目录下的jvm.dll放到你的path(系统路径)下。(不会此时你学java都不会路径设置吧!请阅读最最基本的书吧!) 

 

三、输出结果

       由于启动JVM的输出结果很多,我们省略掉中间部分!

[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]

       ……

[Registering JNI native method java.lang.Compiler.command]

[Registering JNI native method java.lang.Compiler.enable]

       ……

[Dynamic-linking native method java.io.WinNTFileSystem.list ... JNI]

[Dynamic-linking native method java.io.WinNTFileSystem.canonicalizeWithPrefix0 ... JNI]

Java VM destory.n

       看到了吧!包括大量的动态连接本地方法和注册本地方法!最后一行红色的是我们在程序中输出的哦!(不会连这个结果都不知道如何得到吧!――到你程序的目录路径下使用>aaa 111.txt所有信息就到你的111.txt文本文件中了哦!)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多