老兄:我要加载Java虚拟机,调用class的方法啊!

解决方案 »

  1.   

    参考jdk目录下,src.zip 或 src.jar包内的launcher目录下的java.c代码
      

  2.   

    以前可用的代码,如今不工作啦,不知何故?
    哪为高手加载过Java虚拟机,有可运行的代码吗?//加载Java虚拟机
    BOOL InvokeJVM()
    {
    char classpath[4096];  
    //char envpath[4096];
    //char value[4096];
        JDK1_1InitArgs  vm_args;
    jint            res = -1;
    //jmethodID     mid;
        HINSTANCE       hLib = NULL; 
    ::memset(classpath,0,sizeof(classpath));
    char USER_CLASSPATH[1024];
    //获取当前路径
    getUSER_CLASSPATH(USER_CLASSPATH);
    //设置环境变量
    /*memset(envpath,0,sizeof(envpath));
    memset(value,0,sizeof(value));
    ::GetEnvironmentVariable("PATH",envpath,sizeof(envpath));
    boxerror(envpath);
    ::GetCurrentDirectory(sizeof(curdir),curdir);
    sprintf(value,"%s%s;",envpath,curdir);
    ::SetEnvironmentVariable("PATH",value); memset(envpath,0,sizeof(envpath));
    ::GetEnvironmentVariable("PATH",envpath,sizeof(envpath));
    boxerror(envpath);*/ char msg[1024];
    sprintf(msg,"USER_CLASSPATH:%s",USER_CLASSPATH);
    boxerror(msg);    P_JNI_GetDefaultJavaVMInitArgs pfnGetDefaultJavaVMInitArgs = NULL;
        P_JNI_CreateJavaVM             pfnCreateJavaVM = NULL;
     
        //printf("Loading Library .... \n");
        hLib = LoadLibrary("javai");    if(hLib == NULL) {
            boxerror("Unable to Load Library.");
            return FALSE;
        }    
        pfnGetDefaultJavaVMInitArgs = (P_JNI_GetDefaultJavaVMInitArgs) GetProcAddress(hLib, "JNI_GetDefaultJavaVMInitArgs");    // IMPORTANT: specify vm_args version # if you use JDK1.1.2 and beyond 
        vm_args.version =0x00010001; // Get the default arguments 
        if(pfnGetDefaultJavaVMInitArgs != NULL)
            (*pfnGetDefaultJavaVMInitArgs)(&vm_args); //char msg[1024];
    //sprintf(msg,"vm_args.classpath:%s",vm_args.classpath);
    //boxerror(msg);    // Append USER_CLASSPATH to the end of default system class path 
    if(vm_args.classpath != NULL)
            sprintf(classpath, "%s%c%s", vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
        else 
            sprintf(classpath, "%s", USER_CLASSPATH);
        
    //char tt[]="D:\\PQ-SYSTEM\\TestDMTB4\\jars\\rt.jar;D:\\PQ-SYSTEM\\TestDMTB4\\jars\\i18n.jar;.;";
        vm_args.classpath =USER_CLASSPATH;

        // Store the function pointer for creating the VM 
        pfnCreateJavaVM = (P_JNI_CreateJavaVM) GetProcAddress(hLib, "JNI_CreateJavaVM");    // Create the Java VM /
        if(pfnCreateJavaVM != NULL)
            res = (*pfnCreateJavaVM)(&jvm,&env,&vm_args);

        if (res < 0) {
    char err[100];
    sprintf(err,"Can't create Java VM .return:%d",res);
            boxerror(err);
            return FALSE;
        }
    //load sa.class
        cls = env->FindClass( "PQAgent");
        if (cls == 0) {
            boxerror("Can't find PQAgent.class");
            return FALSE;
        }
     
        obj=env->AllocObject(cls); 
    if (obj == 0){
    boxerror("Can't create PQAgent obj");
    return FALSE;
    }
    boxerror("load JVM OK!");
        return TRUE;
    }
      

  3.   

    有个叫javaservice的东西,有源码的,他的作用是在windows service里启动java程序,应该是你要的