나는 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);