首页 > 解决方案 > 如何在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]

这个怎么做?发生错误时,我需要停止该方法。

标签: c++java-native-interface

解决方案


不要试图将返回的结果ThrowNew返回给 Java。它的返回值只告诉你调用是否成功。状态的文档ThrowNew

回报:

成功返回 0;失败的负​​值。

调用ThrowNew将导致 JVM 中的控制流在从本机方法返回时转到异常处理程序。调用后返回任何你想要的值;该值被忽略。对于返回类型为 的方法jobject,只需 return nullptr

    env->ThrowNew(Exception, "Error");
    return nullptr;

推荐阅读