как выбросить исключение java как задание в JNI - PullRequest
1 голос
/ 03 августа 2020

Я новичок в C ++ и jni. Мне нужно вернуть исключение java как задание, а не jint. У меня есть метод, который возвращает задание. Поэтому я получаю ошибку компиляции при попытке вернуть 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]

Как это сделать? Мне нужно остановить метод при возникновении ошибки.

1 Ответ

2 голосов
/ 03 августа 2020

Не пытайтесь вернуть результат ThrowNew обратно в Java. Его возвращаемое значение только говорит вам, был ли вызов успешным. В документации для ThrowNew указано:

RETURNS:

Возвращает 0 в случае успеха; отрицательное значение в случае сбоя.

Вызов ThrowNew вызовет поток управления в JVM на go обработчик исключений после возврата из собственного метода. После вызова верните любое значение, которое хотите; значение игнорируется. Для методов с типом возврата jobject просто верните nullptr.

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