我使用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就显示不出来了大家给分析分析原因。

解决方案 »

  1.   

    DestroyJavaVM 调用出了异常,导致程序非正常退出,下面的22222打不出来是有可能的
      

  2.   

    程序没有退出
    是停在那里了
    我做的是个DOS下的EXE,运行到111111后就不动了
    我等了一个多小时也没继续运行,然后CTRL+C强行退出的
      

  3.   

    DestroyJavaVM是不能保证正常退出的。当jvm里面存在其他的(当前线程外)非守护线程还没有退出的情况下,DestroyJava会阻塞(blocking)。这个问题在JNI的相关文档里面有介绍。
    如果你确认已经完成了你所需要的所有工作,可以直接调用java中的System.exit或C中的exit中止整个程序,当然,你那个22222还是打印不出来。另外:JVM里有exit的Hook,它通过Runtime.addShutdownHook给所有系统服务提供一个能正确的退出而不会丢失数据的方法。
      

  4.   

    多谢taolei,我这就去查查文档去。
      

  5.   

    最终方法:重写了本地BEAN,用最简单的方法去调用EJB,用完就REMOVE
    应该说没有找到真正的问题,也没找到真正的方法,不过解决了,多谢各位.