如何在C里嵌入java虚拟机 编译和运行问题

最近一直在学习JNI编程,从java里调用native方法已经很熟练了,但是如何从C里完全重新创建一个JVM,进而通过JNI的借口调用java的函数呢?

我的上一篇文章里提到了如何在64位win7下编译的问题,这里补充一点,在LIB环境变量里加入“C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\x64”,确保可以找到64位的库。好了,言归正传,我们要在C中嵌入一个java虚拟机。

如果使用“cl -MD invoke.c -link jvm.lib"这样的命令编译内嵌JVM的C代码的时候,出现了一些链接错误,请确保jvm.lib在你的lib环境变量里,这里我的jvm.lib在”C:\Program Files\Java\jdk1.7.0_06\lib“里,所以我将这个路径加入到了LIB环境变量中。当编译通过的时候,你基本完成了我们今天主题的1/3。接下来,尝试运行编译好的exe文件”invoke.exe"。这个时候可能会出一个错误框,提示你jvm.dll找不到,程序无法启动,于是很自然地你会在jdk安装目录搜索jvm.dll文件,然后按照网上给的做法将其拷贝到C:\Windows\System32下(PS:这真是罪恶的开始,如果你木有看我这篇文章,我想你肯定会被折磨的够呛,甚至放弃在C中嵌入JVM的尝试)。接下来你继续运行invoke.exe,这个时候不会报jvm.dll找不到的错误了,但是你会得到提示“Error Output: Error occurred during initialization of VM Unable to load native library: Can't find dependent libraries”,找不到本地依赖库,对,我们需要依赖jvm.dll,但是这个文件木有在我们的环境变量里,好,ok,在JDK安装目录搜索,有两个路径有这个文件“C:\Program Files\Java\jdk1.7.0_06\jre\bin\server”和“C:\Program Files\Java\jre7\bin\server”,我们该选择哪个呢?答案是,无所谓,通过看国外网站关于这个问题的介绍,你只需要将其中一个路径配置到PATH环境变量就行了,不需要做其他别的多余的配置。接着,再继续运行,悲催的是,你还是看到了这个错误“Error Output: Error occurred during initialization of VM Unable to load native library: Can't find dependent libraries”,还记得之前你复制jvm.dll到system32目录下吧,这个就是关键所在,jni官网答疑说,你不能讲jvm.dll随便挪动,否则JVM会困惑,到底加载哪个jvm.dll,是加载system32下的呢,还是你配置的哪个JDK目录下的jvm.dll?所以这个时候,果断删除system32下的jvm.dll,然后重启命令行使所有环境变量配置生效,运行invoke,如下图:




you got it!


红色部分显示你已经从C里正确调用了java里函数!



各位读者如有疑问,可给我留言,大家相互学习,共同进步。另外,本篇提到的代码在sun公司官方jni教程里,第7章中的invoke示例,或者可以向我直接索要。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值