2013-08-01 72 views
1

我正試圖加載存在於.jar中的方法。以下是代碼片段如何使用JNI在C++中加載.jar文件

JavaVMInitArgs vm_args; 
memset(&vm_args, 0, sizeof(vm_args)); 
JavaVMOption* options = new JavaVMOption[1]; 

options[0].optionString = 
     "- Djava.class.path=C:\\Users\\Desktop\\POC\\POC\\Debug\\Sample2.jar;  
vm_args.version = JNI_VERSION_1_6; 
vm_args.nOptions = 1; 
vm_args.options = options; 
vm_args.ignoreUnrecognized = 0; 
JNI_GetDefaultJavaVMInitArgs(&vm_args); 
m_Status = JNI_CreateJavaVM_ptr (&m_JVM, (void**)&m_JavaEnv, &vm_args); 

但是,當我使用

 classForJava = m_JavaEnv->FindClass ("Sample2"); 

classForJava包含0

+0

什麼是m_status? – doctorlove

回答

4

在Java中,只有兩種方法可以讓Java在.jar文件中查找,也就是在類路徑中指定.jar文件,或者創建一個類裝入器來查找該jar文件並將其添加到Java將使用的類加載器列表。

而且,當然,所有的classpath都是一組類加載器,Java在您的程序啓動之前實例化並使用它。

因此,如果JNI程序需要Java才能開始查找額外的.jar文件,那麼JNI程序需要使Java調用設置新的類加載器並讓Java開始使用它。

+0

你能舉個例子嗎? –

+0

這個回覆是一個複製和粘貼從回覆3年早http://stackoverflow.com/questions/2025397/can-c-application-load-the-jar-file-using-jni。 而不是複製和獲得信貸,鏈接到源! –

0

指定類別的全名,包括包名,.替換爲/。 對於exampe如果您Sample2類是在org.test包,使用m_JavaEnv->FindClass ("org/test/Sample2");

順便說一句,這可能是一個錯字,但-Djava.class.path之間的optionString空間應該被刪除。