JVM 在从C++使用 JNI 时找不到类



我正在尝试从JNI C++调用JAVA方法。首先,我得到了这个例子,尝试了一下。我更改了JDK的路径,之后我可以运行示例并且它们正常工作。

之后,我尝试导入我自己的 JAR 文件并从中使用一个类。我从示例中复制了代码,并将类路径和类名替换为我自己的:

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

将解决方案从问题移动到答案:

解决方案:我必须将 maven 依赖项的 JAR 添加到类路径中。现在它工作了!

最新更新