2014-07-23 2 views
0

나는 CreateJavaVM 메소드를 사용하여 jvm을 생성하고 임베드했다. 또한이 jvm에서 사용할 시스템 클래스 로더를 설치하려고합니다. 그러나 내 클래스는 메모리 (네트워크 또는 암호화 된 형식으로 수신)에 있으므로 클래스 경로를 파일 시스템 위치로 설정할 수 없습니다. 대신 시스템 클래스 로더를 내 사용자 정의 클래스 로더로 설정 한 다음이 클래스 로더를 사용하여 다른 클래스 파일을로드하려고 생각하고 있습니다. 그러나 시스템 클래스 로더를 DefineClass 메서드를 사용하여 정의한 클래스 I로 설정하는 방법을 찾지 못했습니다. System.setProperty("java.system.class.loader", "org.me.CustomClassLoader")을 사용하여 클래스 로더를 설정하면 JVM이 생성 된 후에 작동하지 않습니다. 시스템 클래스 로더를 메모리 클래스 로더에서 사용하도록 설정하는 방법이 있습니까?임베디드 JVM 용 시스템 클래스 로더 설정

그런데 클래스 로더를 java.net.URLClassloader로 설정하려고 생각했지만 생성자 서명이 JVM에서 기대하는 것과 일치하지 않기 때문에 불가능합니다.

JavaVM *jvm; 
    JNIEnv *env; 
    JavaVMInitArgs vm_args; 
    JavaVMOption* options = new JavaVMOption[2]; 
    options[0].optionString = "-verbose:jni"; 
    options[1].optionString = " -Djava.system.class.loader=org.me.CustomClassLoader"; 
    vm_args.version = JNI_VERSION_1_6; 
    vm_args.nOptions = 2; 
    vm_args.options = options; 
    vm_args.ignoreUnrecognized = false; 
    // Create jvm 
    JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 

    // Read classdef from network 
    jbyte *data = ReadClassDefinition(); 
    *jcls =env->DefineClass("org/me/CustomClassLoader", NULL, (jbyte*)data, size); 

답변

0

나는 이것을 달성 할 수있는 방법을 찾지 못한다. 나는 클래스 로더 클래스를 임시 jar 파일로 복사하고이 jar 파일의 경로를 -Djava.class.path 속성을 사용하는 JVM의 classpath 매개 변수로 바 꾸었습니다.