【问题标题】:how to throw java exception as jobject in JNI如何在JNI中将java异常作为jobobject抛出
【发布时间】:2020-08-03 15:21:27
【问题描述】:

我是 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 返回一个jint,但在你说的签名中,你返回一个jobject
  • 是的,我明白了。可能有一些方法会在 jobject 存在时返回 java 异常?
  • 使用ThrowNewObject

标签: c++ java-native-interface


【解决方案1】:

不要尝试将ThrowNew 的结果返回给Java。它的返回值只告诉你调用是否成功。 documentation for ThrowNew 声明:

返回:

成功返回0;失败时为负值。

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

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

【讨论】:

  • @TainToTain 谢谢,我也这么认为。如果没有其他选择,也许返回 null 是个好主意。
  • @rustyx 而不是 'return env->ThrowNew' 写 'env->ThrowNew...... ;返回空指针; ' 然后您将在 java 代码中捕获 MyClientException。使用 java try/catch
猜你喜欢
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
相关资源
最近更新 更多