站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题问一个JNI的难题?!

问一个JNI的难题?!

摘要: 问一个JNI的难题?!


在C++程序里调用"JNI_CreateJavaVM"函数是不是只能创建一个虚拟机?
因为我第二次调用"JNI_CreateJavaVM"时它返回-1。

我看了sun的文档,里面说并不是所有厂商的Java虚拟机都可以在同一个进程中创建多个,但是连sun自家的都不行吗?


没有高手吗?


不可以,但我也不知道为什么。而且好像没有那个必要创建2个虚拟机。就像加载
2次jvm.dll一样没用。


Windows上好像确实不行。
也许Unix/Linux下可以。但是确实没有必要这么做。


en, 我在 Sun 的文档里没有看到明确说“不行”的地方,感觉应该是行的~~

至于楼上兄弟说的“必要性”,我觉得有些情况下还是需要的,比如为了隔离。

楼主是在同一个线程中调用 JNI_CreateJavaVM() 的吗?如果是的话,不妨试试在*不同*的线程中调用。


我还真没试过创建两个JVM,一个倒是做过,真要回家试试看。


maquan('ma:kju)
我是在两个线程分别调用"JNI_CreateJavaVM"的,而且调用的时间也不同。


?


?


在不同的操作系统中的线程,进程的概念是存在差别的。
Win32上java.exe就是一个虚拟机,是一个进程。里面可能有多个ClassLoader加载多个App。



查了一下 JDK 的 source code(我用的是 jdk-1_5_0-src-scsl),在 jni.cpp 里看到这样一段,hehe~~

_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, void *args) {
// At the moment it's only possible to have one Java VM,
// since some of the runtime state is in global variables.

// We cannot use our mutex locks here, since they only work on
// Threads. We do an atomic compare and exchange to ensure only
// one thread can call this method at a time
if (Atomic::add(1, &num_vm_created) > 1) {
return JNI_ERR;
}
if (Atomic::xchg(1, &vm_created) == 1) {
Atomic::dec(&num_vm_created);
return JNI_ERR;
}

assert(vm_created == 1, "vm_created is true during the creation");
……


学习。。。


maquan('ma:kju)
意思是说只能创建一个jvm了...


看来就是只能创建一个 JVM 了,既然 Sun 的 JDK 就是这么做的~~

我也写了个 C 程序试过了,没什么新发现 :(


算了,结贴!


↑返回目录
前一篇: 如何把double类型四舍五入到小数后两位,急
后一篇: java 中 如何生成 xml 协议报文 ? 然后再将报文序列化后传输?