c++ - 如何在JNI中将java异常作为jobobject抛出

标签 c++ java-native-interface

我是 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
编译错误:

error: invalid conversion from ‘jint’ {aka ‘int’} to ‘jobject’ {aka ‘_jobject*’} [-fpermissive]


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

最佳答案

不要试图返回 ThrowNew 的结果回到Java。它的返回值只告诉你调用是否成功。 documentation对于 ThrowNew状态:

RETURNS:

Returns 0 on success; a negative value on failure.


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

关于c++ - 如何在JNI中将java异常作为jobobject抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63232248/

相关文章:

c++ - 父类(super class)调用子类方法的STL迭代器

java - 如何通过 JNI 设置 Java 类的 Double/Integer 类型的值

java - 相机崩溃 : Fatal signal 6 (SIGABRT) with JNI code

android - Lame 编码的 mp3 音频速度变慢 - Android

c++ - 仅为类的特定模板实例化声明成员函数

c++ - VS Code 调试控制台输入

android - 如何将Android R8混淆应用于 native 代码?

android - 编译项目时出现 undefined reference 错误(ANDROID NDK)

c++ - 使用智能指针继承的 pimpl

c++ - log4cxx 配置文件语法