JVM 在从C++使用 JNI 时找不到类
JVM can't find class when using JNI from C++
我正在尝试从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 添加到类路径中。现在它工作了!
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 找不到QtResource文件中的文件
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 找不到以下加速库:boost_fiber
- JVM 在从C++使用 JNI 时找不到类
- Android找不到我的JNI原生库函数
- 通过 JNI 从应用程序创建 JVM 后C++找不到类
- 如果 JVM 的参数是从其他类型的转换而来的,JNI 找不到该类
- jni 在内部类中找不到方法,java.lang.NoSuchMethodError
- JNI HellowWorld 不满意链接错误 找不到依赖库
- 通过 JNI/C++ 调用时找不到 Java 方法
- JNI FindClass 找不到使用 jar 的类
- 为什么这个基于 JNI 的 JBoss 模块会抛出错误"找不到依赖库"?