📄 jvm.cpp
字号:
//////////////////////////////////////////////////////////////////////
// implementation of the CJvm class.
#include <windows.h>
#include "Jvm.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
JavaVM * CJvm::ms_jvm = NULL;
unsigned long CJvm::ms_tlsIndex = -1;
void CJvm::CreateJVM(int argc, char* argv[])
{
if (-1 == ms_tlsIndex)
{
ms_tlsIndex = TlsAlloc();
if (-1 == ms_tlsIndex)
{
return;
}
}
JavaVMOption options[3];
options[0].optionString = "-Djava.compiler=";
for (int i = 0; i < argc; i++)
{
options[i+1].optionString = argv[i];
}
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_4;
vm_args.options = options;
vm_args.nOptions = argc + 1;
vm_args.ignoreUnrecognized = JNI_FALSE;
void * pEnv = NULL;
JNI_CreateJavaVM(&ms_jvm, &pEnv, &vm_args);
TlsSetValue(ms_tlsIndex, pEnv);
}
void CJvm::DestroyJVM()
{
if (NULL != ms_jvm)
{
ms_jvm->DestroyJavaVM();
ms_jvm = NULL;
ms_tlsIndex = -1;
}
}
JavaVM * CJvm::GetJVM()
{
return ms_jvm;
}
JNIEnv * CJvm::GetJNIEnv()
{
if ((NULL == ms_jvm) || (-1 == ms_tlsIndex))
{
return NULL;
}
JNIEnv * env = (JNIEnv *) TlsGetValue(ms_tlsIndex);
if (NULL != env)
{
return env;
}
ms_jvm->AttachCurrentThread((void **)&env, NULL);
if (NULL == env)
{
return NULL;
}
TlsSetValue(ms_tlsIndex, env);
return env;
}
jobject CJvm::CreateJavaObject(const char * szClassName, int handleSource)
{
JNIEnv * env = GetJNIEnv();
if (NULL == env)
{
return NULL;
}
jclass javaClass = env->FindClass(szClassName);
if (NULL == javaClass)
{
return NULL;
}
jmethodID mid = env->GetMethodID(javaClass, "<init>", "(I)V");
if (NULL == mid)
{
return NULL;
}
jobject jobj = env->NewObject(javaClass, mid, (jint)handleSource);
return jobj;
}
void CJvm::ReleaseJObject(jobject jobj)
{
JNIEnv * env = GetJNIEnv();
if (NULL == env)
{
return;
}
jclass javaClass = env->GetObjectClass(jobj);
if (NULL == javaClass)
{
return;
}
jmethodID mid = env->GetMethodID(javaClass, "release", "()V");
if (NULL == mid)
{
return;
}
env->CallVoidMethod(jobj, mid);
}
void CJvm::DetachThread()
{
if ((NULL == ms_jvm) || (-1 == ms_tlsIndex))
{
return;
}
JNIEnv * env = (JNIEnv *) TlsGetValue(ms_tlsIndex);
if (NULL == env)
{
return;
}
TlsSetValue(ms_tlsIndex, NULL);
ms_jvm->DetachCurrentThread();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -