使用JNI在.jar中查找Java类
Find Java class in .jar using JNI
我正在编写一个程序,使用JNI从C++代码中调用Java函数。如果我直接使用.class
文件,我的程序运行良好,但当我将其添加到jar文件时,FindClass
会失败。例如,这很好
std::string stdOpt = "-Djava.class.path=<path_to_jar>/dependency.jar;<path_to_class>";
boost::scoped_array<char> opt(new char[stdOpt.size() + 1]);
std::copy(stdOpt.begin(), stdOpt.end(), opt.get());
opt[stdOpt.size()] = ' ';
options[0].optionString = opt.get();
JavaVMInitArgs vm_args;
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
long status = JNI_CreateJavaVM(&m_pJavaVirtualMachine, (void**)&m_pJavaEnvironment, &vm_args);
if (status != JNI_OK)
throw std::logic_error("Cannot start Java Virtual Machine");
m_class = m_pJavaEnvironment->FindClass("MyClass");
if(m_class == 0)
throw std::logic_error("Cannot find Java class");
但这一次失败了
std::string stdOpt = "-Djava.class.path=<path_to_jar>/dependency.jar;<path_to_jar>/myjar.jar";
boost::scoped_array<char> opt(new char[stdOpt.size() + 1]);
std::copy(stdOpt.begin(), stdOpt.end(), opt.get());
opt[stdOpt.size()] = ' ';
options[0].optionString = opt.get();
JavaVMInitArgs vm_args;
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
long status = JNI_CreateJavaVM(&m_pJavaVirtualMachine, (void**)&m_pJavaEnvironment, &vm_args);
if (status != JNI_OK)
throw std::logic_error("Cannot start Java Virtual Machine");
m_class = m_pJavaEnvironment->FindClass("MyClass"); //m_class=NULL
if(m_class == 0)
throw std::logic_error("Cannot find Java class"); //throwing exception
当我试图从.jar
中获取Java类时,我应该做什么区别吗?怎么了?有什么想法吗?
如果您的类在一个包中,请在对FindClass的调用中包括该包,而不是类路径。
m_class = m_pJavaEnvironment->FindClass( "com/mycompany/mypackage/MyClass" );
事实证明,这个问题不在代码中。代码很好。制作.jar
文件时出现问题。我使用的是Visual Studio,用于将.java
自动编译为.class
,并将.class
添加到我添加到项目预构建事件的.jar
文件中。所以在制作.jar
文件之前,我应该指定当前目录,比如这个
cd"<_directory_where_.class_file_is_located>"
jar cf myjar.jar MyClass.class
否则MyClass.class
被添加到具有其绝对路径的文件夹的.jar
文件中,FindClass()
失败。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 使用正则表达式regex_search在字符串中查找字符串
- 使用gcc从静态链接的文件中查找可选符号
- 在C++中查找范围的长度
- 在java中解决这段代码时面临循环中的问题
- 算法问题:查找从堆栈中弹出的所有序列
- 尝试用java代码编译和运行c++代码
- 在Windows中查找扬声器输出的当前音量级别
- 查找表示 GPS 路线的两条线(MATLAB、Java、C++ 或 Python)之间的距离
- 如何使用本机代码以编程方式查找Java本地变量的内存地址
- 使用JNI在.jar中查找Java类
- Java JNI符号查找错误
- 如何查找Java + JNI + c++进程中的内存泄漏
- Cap'n Proto - 在 Java 中查找消息大小