全部博文(512)
分类: C/C++
2007-10-31 10:51:39
[1] 配置并构造 JVM
JVM 的配置与构造与 CLR 的非常类似(CLR 的相关使用方法可以参考《.Net平台下CLR程序载入原理分析 [草稿]》一
文 )。用户程序通过 JRE 的 jvm.dll 提供的接口,构造并配置虚拟机,调用相应的类的方法,完成实际工作。从 JDK 1.2 开始,
JRE 提供了 client/server 两个版本的 jvm.dll,一般可以在 %JRE%\bin\client 和 %JRE%\bin\
server 目录下找到,和 CLR 中的 wks/srv 类似。jvm.dll 提供了 JNI_CreateJavaVM 函数用于构造虚拟机,
对应于 CLR 中 mscoree.dll 提供的 CorBindToRuntimeEx 函数。此函数的定义可以在 %JDK%\include\
jni.h 头文件里面找到,静态链接可以通过 %JDK%\lib\jvm.lib 库文件完成,动态连接则可以根据选用 JRE 的虚拟机类型从相应
jvm.dll 中使用 GetProcAddress 函数获得入口。
以下为引用:
_JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
以下为引用:
namespace JBridge
{
public class JStub
{
[DllImport("JvmStub.dll")]
public static extern IntPtr CreateJVM();[DllImport("JvmStub.dll")]
public static extern void DestroyJVM(IntPtr vm);
}
public class JVM
{
static private IntPtr _vm = IntPtr.Zero;private JVM()
{
}~JVM()
{
if(_vm != IntPtr.Zero)
{
JStub.DestroyJVM(_vm);
_vm = IntPtr.Zero;
}
}public static IntPtr getInstance()
{
if(_vm == IntPtr.Zero)
{
lock(typeof(JVM))
{
if(_vm == IntPtr.Zero)
{
_vm = JStub.CreateJVM();
}
}
}
return _vm;
}
}
}
以下为引用:
struct JavaVM_
{
jint DestroyJavaVM()
{
// ...
}
jint AttachCurrentThread(void **penv, void *args)
{
// ...
}
jint DetachCurrentThread()
{
// ...
}
}
以下为引用:
#define JNI_VERSION_1_1 0x00010001
#define JNI_VERSION_1_2 0x00010002
#define JNI_VERSION_1_4 0x00010004typedef struct JavaVMInitArgs {
jint version;
jint nOptions;
JavaVMOption *options;
jboolean ignoreUnrecognized;
} JavaVMInitArgs;
以下为引用:
typedef struct JavaVMOption {
char *optionString;
void *extraInfo;
} JavaVMOption;
JavaVMOption opts[5];opts[0].optionString = "-Djava.class.path=F:\\Study\\Java\\JNI\\Prompt";
opts[1].optionString = "-Djava.library.path=F:\\Study\\Java\\JNI\\Prompt";
opts[2].optionString = "-verbose:jni";
opts[3].optionString = "-Xcheck:jni";
opts[4].optionString = "-Xbootclasspath:E:\\Borland\\JBuilderX\\jdk1.4\\jre\\lib\\rt.jar";JavaVMInitArgs args;
args.version = JNI_VERSION_1_2;
args.options = opts;
args.nOptions = sizeof(opts) / sizeof(opts[0]);
args.ignoreUnrecognized = JNI_TRUE;Check(JNI_CreateJavaVM(&m_jvm, reinterpret_cast
(static_cast (m_env)), &args));