我试图通过JNI从C++调用JAVA方法。首先,我获取了这个例子并尝试了它。我修改了JDK的路径后,成功运行了这些示例并且它们能够正常工作。
然后,我尝试导入我的自定义JAR文件并使用其中的一个类。我复制了示例代码,并将classpath和classname替换为我的自定义路径:
该JAR文件仅包含一个名为
JAR文件包含MyClass.class文件,我已经检查过。
我查看了一些以前的问题(1,2,3和其他一些问题),但是我无法确定自己犯了什么错误。
更新:我尝试将MyClass.class文件和MyJar.jar文件复制到链接前面的示例目录中,JVM无法找到
是什么导致JVM找不到
然后,我尝试导入我的自定义JAR文件并使用其中的一个类。我复制了示例代码,并将classpath和classname替换为我的自定义路径:
void MyCPPClass::CallJava()
{
JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine)
JNIEnv *env; // Pointer to native interface
//==================== prepare loading of Java VM ============================
JavaVMInitArgs vm_args; // Initialization arguments
JavaVMOption* options = new JavaVMOption[ 1 ]; // JVM invocation options
options[ 0 ].optionString = "-Djava.class.path=MyJar.jar"; // where to find java .class
vm_args.version = JNI_VERSION_1_8; // minimum Java version
vm_args.nOptions = 1; // number of options
vm_args.options = options;
vm_args.ignoreUnrecognized = false; // invalid options make the JVM init fail
//================= load and initialize Java VM and JNI interface ===============
jint rc = JNI_CreateJavaVM( &jvm, (void**)&env, &vm_args ); // YES !!
delete options; // we then no longer need the initialisation options.
//========================= analyse errors if any ==============================
// if process interuped before error is returned, it's because jvm.dll can't be
// found, i.e. its directory is not in the PATH.
if( rc != JNI_OK )
{
exit( EXIT_FAILURE );
}
jclass cls1 = env->FindClass( "aaa/bbb/MyClass" );
...
}
该JAR文件仅包含一个名为
aaa.bbb.MyClass
的类,是使用IntelliJ IDEA和mvn package
命令制作的。我将JAR文件复制到了可执行文件旁边。
rc
的值始终为0(JNI_OK
),但是cls1
的值始终为NULL
。我认为JVM可以找到JAR文件,因为在调试时,在FindClass
之后我不能删除JAR文件。JAR文件包含MyClass.class文件,我已经检查过。
我查看了一些以前的问题(1,2,3和其他一些问题),但是我无法确定自己犯了什么错误。
更新:我尝试将MyClass.class文件和MyJar.jar文件复制到链接前面的示例目录中,JVM无法找到
MyClass
。我的java源文件是否有遗漏?包声明是正确的。是什么导致JVM找不到
MyClass
?