我在Windows的C++應用程序中創建了一個JVM,我無法說服它加載多個JAR。在Windows上加載多個JAR-JNI JNI_CreateJavaVM
我的C++代碼:
MyClass::MyClass(std::string & classPath) {
classPath = "-cp "+classPath; // <-- Won't work with any path or single jar
//classPath = "-Djava.class.path="+classPath; <-- Only works with single jar
jvmOptions[0].optionString = (char *)classPath.c_str();
jvmOptions[1].optionString = "-Xms8m";
jvmOptions[2].optionString = "-Xmx24m";
jvmArgs.version = JNI_VERSION_1_6;
jvmArgs.options = jvmOptions;
jvmArgs.nOptions = 3;
jvmArgs.ignoreUnrecognized = JNI_TRUE;
int jvmInitResult = CreateJavaVM(&jvm, (void**)&environment, &jvmArgs);
if(jvmInitResult >= 0) {
jclass loadedClass = environment->FindClass(MyClassName.c_str());
.....
如果我傳遞給一個單獨的JAR通過我classPath
可變的路徑,如"C:\path\myjar.jar"
,所述jclass
變量位於細。但是,我的Java類需要額外的JAR才能運行,所以我需要將多個JAR傳遞給jvmOptions
。當我試圖通過以下任何一種方式通過第二個或第三個JAR時,FindClass
調用現在失敗。
C:\path\myjar.jar <--------- FindClass SUCCESS; can't use due to missing jars
C:\path\myjar.jar;C:\path\secondjar.jar <-----FindClass FAIL
C:\path\myjar.jar:C:\path\secondjar.jar <-----FindClass FAIL
C:\path\* <-----FindClass FAIL
C:\path\*.jar <-----FindClass FAIL
"C:\path\myjar.jar;C:\path\secondjar.jar" <-----FindClass FAIL
"C:\path\myjar.jar:C:\path\secondjar.jar" <-----FindClass FAIL
我假設還有另一個選項,我沒有想到,但這使我瘋了。
'jvmOptions [0] = .optionString(字符*)( 「 - Djava.class.path =」 +類路徑).c_str( );' - 首先,你不希望修改它,其次,指針在該語句之後搖擺不定。 – chris
我同意,這一步是暫時的,但我需要一個快速動態的方式來改變這一點,而無需重新編譯,而我找到了正確的格式。該變量作爲命令行參數傳入。 – Samhain
@chris評論過的行永遠不會工作,因爲''-Djava.class.path =「+ classPath'會創建一個臨時的'std :: string',在該語句結束時被銷燬。 'jvmOptions [0] .optionString'指向其上的無效內存。也許你想用'classPath.insert(...)'代替。 – Praetorian