2013-08-01 37 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空间应该被删除。