当前页面: 开发资料首页 → 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 程序试过了,没什么新发现 :(
算了,结贴!