Приложение разбилось, когда (* env) - & gt; FindClass (env, & ldquo; package / WrongClass & rdquo;); [Дубликат]

Ну, простыми словами:

Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

22
задан Roland Illig 22 November 2011 в 00:18
поделиться

1 ответ

Это дополнение к ответу Эллиотта Хьюза . Мой ответ содержит пошаговый пример, объясняющий, как перехватывать исключения и как их переводить между словами C ++ и Java, используя слой JNI .

Короткий ответ

См. правильный ответ Эллиотта Хьюза .

Пример повторного использования

Этот ответ и фрагменты находятся в открытом доступе или в CC0, чтобы облегчить повторное использование. Весь исходный код здесь является совместимым с C ++ 03.

Чтобы повторно использовать приведенный выше фрагмент, сделайте следующее:

  • Замените mypackage::Exception своим собственным Исключением на C ++.
  • Если соответствующее исключение Java my.group.mypackage.Exception не определено, замените "my/group/mypackage/Exception" на "java/lang/RuntimeException".

Исключить исключения из Java

См. Также фрагмент на coliru .

void rethrow_cpp_exception_as_java_exception()
{
  try
  {
    throw; // This allows to determine the type of the exception
  }
  catch (const mypackage::Exception& e) {
    jclass jc = env->FindClass("my/group/mypackage/Exception");
    if(jc) env->ThrowNew (jc, e.what());
    /* if null => NoClassDefFoundError already thrown */
  }
  catch (const std::bad_alloc& e) {
    jclass jc = env->FindClass("java/lang/OutOfMemoryError");
    if(jc) env->ThrowNew (jc, e.what());
  }
  catch (const std::ios_base::failure& e) {
    jclass jc = env->FindClass("java/io/IOException");
    if(jc) env->ThrowNew (jc, e.what());                          
  }                                                               
  catch (const std::exception& e) {
    /* unknown exception (may derive from std::exception) */
    jclass jc = env->FindClass("java/lang/Error");
    if(jc) env->ThrowNew (jc, e.what());
  }
  catch (...) {
    /* Oops I missed identifying this exception! */
    jclass jc = env->FindClass("java/lang/Error");
    if(jc) env->ThrowNew (jc, "Unidentified exception => "
      "Improve rethrow_cpp_exception_as_java_exception()" );
  }
}

Я благодарю Mooing Duck за вклад в код C ++.

] Адаптировать исходный код JNI

В следующем файле Java_my_group_mypackage_example.cpp используется вышеупомянутая функция rethrow_cpp_exception_as_java_exception():

JNIEXPORT jlong JNICALL Java_my_group_mypackage_example_function1
        (JNIEnv *env, jobject object, jlong value)
{
  try {
    /* ... my processing ... */
    return jlong(result);
  } catch(...) {
    rethrow_cpp_exception_as_java_exception();
    return 0;
  }
}

JNIEXPORT jstring JNICALL Java_my_group_mypackage_example_function2
        (JNIEnv *env, jobject object, jlong value)
{
  jstring jstr = 0
  try {
    /* ... my processing ... */
    jstr = env->NewStringUTF("my result");
  } catch(...) {
    rethrow_cpp_exception_as_java_exception();
  }
  return  jstr;
}

JNIEXPORT void JNICALL Java_my_group_mypackage_example_function3
        (JNIEnv *env, jobject object, jlong value)
{
  try {
    /* ... my processing ... */
  } catch(...) {
    rethrow_cpp_exception_as_java_exception();
  }
}

Соответствующий код Java

Файл example.java

package my.group.mypackage;

public class Example {
  static {
    System.loadLibrary("my-DLL-name");
  }

  public Example() {
    /* ... */
  }

  private native int    function1(int); //declare DLL functions
  private native String function2(int); //using the keyword
  private native void   function3(int); //'native'

  public void dosomething(int value) {
    int result = function1(value);  
    String str = function2(value);  //call your DLL functions
    function3(value);               //as any other java function
  }
}

Примечание: «my-DLL-name» относится к динамической библиотеке, созданной из приведенного выше кода на C / C ++. Это может быть my-DLL-name.dll в Windows или my-DLL-name.so в GNU / Linux / Unix.

Шаги

  1. Сгенерировать example.class из example.java (используя javac или maven или ваш любимый IDE Eclipse / Netbeans / IntelliJ IDEA /...)
  2. Сгенерировать заголовочный файл C / C ++ Java_my_group_mypackage_example.h из example.class с помощью javah
11
ответ дан olibre 31 August 2018 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: