c++ - 如何在JNI中将java异常作为jobobject抛出
问题描述
我是 C++ 和 jni 的新手。我需要将 java 异常作为作业返回,而不是 jint。我有一个返回 jobject 的方法。所以在尝试返回 ThrowNew 时出现编译错误:
JNIEXPORT jobject JNICALL Java_com_my_get(JNIEnv* env, jobject obj) {
some::SomeObject returnObject;
try {
//... trying to get returnObject by calling lib method
returnObject = some::lib::getSomeObject();
} catch (...) {
// report problem back to Java.
jclass Exception = env->FindClass("com/my/MyClientException");
return env->ThrowNew(Exception, "Error");
}
//... return returnObject mapped to jobject
}
java原生部分:
public native MyJavaObject get(); // need object or exception
编译错误:
错误:从 'jint' {aka 'int'} 到 'jobject' {aka '_jobject*'} 的无效转换 [-fpermissive]
这个怎么做?发生错误时,我需要停止该方法。
解决方案
不要试图将返回的结果ThrowNew
返回给 Java。它的返回值只告诉你调用是否成功。状态的文档ThrowNew
:
回报:
成功返回 0;失败的负值。
调用ThrowNew
将导致 JVM 中的控制流在从本机方法返回时转到异常处理程序。调用后返回任何你想要的值;该值被忽略。对于返回类型为 的方法jobject
,只需 return nullptr
。
env->ThrowNew(Exception, "Error");
return nullptr;
推荐阅读
- python - Python:如何将每个负数都变成零?
- python - OSError: [Errno 2] 运行 python 单元测试时没有这样的文件或目录
- html - 从css链接加载背景图像时获取404
- android - Android int/double 计算随机溢出
- memory-leaks - Xcode UIImage imageWithCGImage 内存泄漏
- python - Eliminate numbers between 1 and 100 present in list
- java - 用于 Java 的 ArraList.forEach 在 while 循环内无法正常工作
- android - 如何在 Android 中制作登录系统?
- javascript - 为什么我不能将标题背景设置为十六进制值?
- cakephp - Cakephp 从表中检索行数据