我使用C++调用一个JAVABEAN,此BEAN又调用WEBLOGIC上的EJB,EJB访问数据库
基本的访问方法已经解决,现在的问题是当JVM销毁时停住了
代码大致如下:
options[0].optionString = "-Djava.class.path=.";vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;jint status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
assert( JNI_ERR != status );cls = env->FindClass("TEST1");
assert( 0 != cls );mid = env->GetMethodID(cls, "<init>", "(Ljava/lang/String;)V");
assert( 0 != mid );obj = env->NewObject(cls, mid, env->NewStringUTF("TESTEJB"));
assert( 0 != obj );mid = env->GetMethodID(cls, "initialize", "()V");
assert( 0 != mid );env->CallVoidMethod(obj, mid);
jthrowable exp = env->ExceptionOccurred();
if (exp)
{
printf("exception1\n");
env->ExceptionClear();
}
else
{
printf("init.....!\n");
}mid = env->GetMethodID(cls, "login", "(Ljava/lang/String;Ljava/lang/String;)Lcom/pasc/ums/model/User;");
jobject user = env->CallObjectMethod(obj, mid, env->NewStringUTF("999"), env->NewStringUTF("999"));
exp = env->ExceptionOccurred();
if (exp)
{
printf("exception2\n");
env->ExceptionClear();
}
else
{
printf("login.....!\n");
}mid = env->GetMethodID(cls, "destroy", "()V");
assert( 0 != mid );env->CallVoidMethod(obj, mid);
exp = env->ExceptionOccurred();
if (exp)
{
printf("exception3\n");
env->ExceptionClear();
}
else
{
printf("destroy.....!\n");
}printf("111111111111111\n");
jvm->DestroyJavaVM();
printf("2222222222222222\n");前面都能显示出来
1111111111都可以显示出来
2222222222就显示不出来了大家给分析分析原因。
基本的访问方法已经解决,现在的问题是当JVM销毁时停住了
代码大致如下:
options[0].optionString = "-Djava.class.path=.";vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;jint status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
assert( JNI_ERR != status );cls = env->FindClass("TEST1");
assert( 0 != cls );mid = env->GetMethodID(cls, "<init>", "(Ljava/lang/String;)V");
assert( 0 != mid );obj = env->NewObject(cls, mid, env->NewStringUTF("TESTEJB"));
assert( 0 != obj );mid = env->GetMethodID(cls, "initialize", "()V");
assert( 0 != mid );env->CallVoidMethod(obj, mid);
jthrowable exp = env->ExceptionOccurred();
if (exp)
{
printf("exception1\n");
env->ExceptionClear();
}
else
{
printf("init.....!\n");
}mid = env->GetMethodID(cls, "login", "(Ljava/lang/String;Ljava/lang/String;)Lcom/pasc/ums/model/User;");
jobject user = env->CallObjectMethod(obj, mid, env->NewStringUTF("999"), env->NewStringUTF("999"));
exp = env->ExceptionOccurred();
if (exp)
{
printf("exception2\n");
env->ExceptionClear();
}
else
{
printf("login.....!\n");
}mid = env->GetMethodID(cls, "destroy", "()V");
assert( 0 != mid );env->CallVoidMethod(obj, mid);
exp = env->ExceptionOccurred();
if (exp)
{
printf("exception3\n");
env->ExceptionClear();
}
else
{
printf("destroy.....!\n");
}printf("111111111111111\n");
jvm->DestroyJavaVM();
printf("2222222222222222\n");前面都能显示出来
1111111111都可以显示出来
2222222222就显示不出来了大家给分析分析原因。
是停在那里了
我做的是个DOS下的EXE,运行到111111后就不动了
我等了一个多小时也没继续运行,然后CTRL+C强行退出的
如果你确认已经完成了你所需要的所有工作,可以直接调用java中的System.exit或C中的exit中止整个程序,当然,你那个22222还是打印不出来。另外:JVM里有exit的Hook,它通过Runtime.addShutdownHook给所有系统服务提供一个能正确的退出而不会丢失数据的方法。
应该说没有找到真正的问题,也没找到真正的方法,不过解决了,多谢各位.