通过 JNI 从应用程序创建 JVM 后C++找不到类
Fail to find class after creating a JVM from C++ application via JNI
使用 JNI,我尝试从C++项目创建 Java 类的实例,但失败了。我已经用一个简单的 Java 类测试了相同的代码,它可以工作。不同之处在于我的实际类路径是一个包含一堆 jar 的目录。我需要实例化CmaesClient
的类属于其中一个jar。
这是C++代码:
JavaVM* jvm = NULL;
JNIEnv *env = NULL;
JavaVMInitArgs vm_args;
JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = "-Djava.class.path=/home/azg/code/hpcmom/target/1.1.9-SNAPSHOT/hpcmom-cmaes";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args);
if (jvm == NULL) {
std::cout << "Failed creating JVM" << std::endl;
} else {
std::cout << "Succeeded creating JVM" << std::endl;
}
jclass clazz = env->FindClass("com.sfoam.hpcmom.cmaes.CmaesClient");
if (clazz == NULL) {
std::cout << "Failed creating CmaesClient" << std::endl;
} else {
std::cout << "Succeeded creating CmaesClient" << std::endl;
}
jmethodID constr = env->GetMethodID(clazz, "<init>", "([Ljava/lang/String;)V");
jstring jarPath = env->NewStringUTF("/home/azg/code/hpcmom/target/1.1.9-SNAPSHOT/hpcmom-cmaes/hpcmom-cmaes-1.1.9-SNAPSHOT.jar");
jobject object = env->NewObject(clazz, constr, jarPath);
delete options;
jvm->DestroyJavaVM();
并且错误意味着它找不到类,因此加载类似乎有问题,或者?
Succeeded creating JVM
Failed creating CmaesClient
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f5601067214, pid=25496, tid=140007371831104
#
# JRE version: Java(TM) SE Runtime Environment (7.0_51-b13) (build 1.7.0_51-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V [libjvm.so+0x645214] get_method_id(JNIEnv_*, _jclass*, char const*, char const*, bool, Thread*)+0x84
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/azg/code/sfoml/debug/hs_err_pid25496.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
#
Aborted (core dumped)
目录/home/azg/code/hpcmom/target/1.1.9-SNAPSHOT/hpcmom-cmaes
包含所有需要的 jar。
JNI 函数
name
:完全限定的类名(即包名,分隔 由"/
",后跟类名)。
改变
env->FindClass("com.sfoam.hpcmom.cmaes.CmaesClient");
自
env->FindClass("com/sfoam/hpcmom/cmaes/CmaesClient");
(即用/
替换每个.
)。
相关文章:
- 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
- 找不到 FLTK(缺少:FLTK_INCLUDE_DIR)
- 设置 Visual Studio for MPI: 找不到标识符错误
- "assimp/config.h"找不到,但它在文件夹中
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- C++系统找不到指定的文件错误
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- vcpkg 添加新库,但找不到
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 找不到Linux Visual Studio代码C++文件