如何在 JNI 中作为 jobject 抛出 java 异常
how to throw java exception as jobject in JNI
我是 c++ 和 jni 的新手。我需要 return java 异常作为 jobject,而不是 jint。我有一个 returns jobject 的方法。所以我在尝试 return 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
编译错误:
error: invalid conversion from ‘jint’ {aka ‘int’} to ‘jobject’ {aka
‘_jobject*’} [-fpermissive]
如何做到这一点?我需要在发生错误时停止该方法。
不要试图将 return ThrowNew
的结果返回到 Java。它的 return 值只告诉你调用是否成功。 ThrowNew
的 documentation 状态:
RETURNS:
Returns 0 on success; a negative value on failure.
调用 ThrowNew
将导致 JVM 中的控制流从本机方法 return 转到异常处理程序。 Return调用后你想要的任何值;该值被忽略。对于 return 类型 jobject
的方法,只需 return nullptr
.
env->ThrowNew(Exception, "Error");
return nullptr;
我是 c++ 和 jni 的新手。我需要 return java 异常作为 jobject,而不是 jint。我有一个 returns jobject 的方法。所以我在尝试 return 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
编译错误:
error: invalid conversion from ‘jint’ {aka ‘int’} to ‘jobject’ {aka ‘_jobject*’} [-fpermissive]
如何做到这一点?我需要在发生错误时停止该方法。
不要试图将 return ThrowNew
的结果返回到 Java。它的 return 值只告诉你调用是否成功。 ThrowNew
的 documentation 状态:
RETURNS:
Returns 0 on success; a negative value on failure.
调用 ThrowNew
将导致 JVM 中的控制流从本机方法 return 转到异常处理程序。 Return调用后你想要的任何值;该值被忽略。对于 return 类型 jobject
的方法,只需 return nullptr
.
env->ThrowNew(Exception, "Error");
return nullptr;