Пользовательские исключения JNI с более чем одним параметром

#java #android #c #exception #java-native-interface

#java #Android #c #исключение #java-native-interface

Вопрос:

Я довольно новичок в JNI goodness, поэтому, пожалуйста, просто скажите мне, не веду ли я себя глупо.

Я пытаюсь создать пользовательское исключение из C на уровень Java, которое создается как со строкой, так и с целым числом. Я не могу заставить ThrowNew () работать, потому что он принимает только один строковый параметр. КАЖДЫЙ пример пользовательского исключения, который я смог найти, использует ThrowNew()!! Grrrrrr

Я предполагаю, что мне нужно будет сконструировать один из них и выбросить его с помощью «Throw (jthrowable obj)», но я не уверен.. это то же самое, что «ThrowNew()»??

Например, это то, что мне нужно:

 int myErrorCode = 42;
const char* myErrorString = "stuff broke";

jclass myExceptionClass = env->FindClass("MyException");
env->ThrowNew(myExceptionClass, myErrorString, myErrorCode );//<-- of course this wont work!
  

Этот код отлично работает, если мой класс exception выглядит как Exception() и принимает только строку.

Кто-нибудь знает, как создать и создать НОВЫЙ экземпляр исключения в java, который принимает параметры, отличные от строки по умолчанию Exception()? Выбрасывание только строки для меня бесполезно.

Заранее спасибо!

Ответ №1:

Вы можете использовать env->Throw для создания экземпляра, созданного вручную:

 jclass myExceptionClass = env->FindClass("MyException");
jstring myErrorJString = env->NewStringUTF(myErrorString);
jmethodID ctorMethod = env->GetMethodID(myExceptionClass, "<init>", "(Ljava/lang/String;I)V");
jobject myExceptionObject = env->NewObject(myExceptionClass, ctorMethod, myErrorJString, myErrorCode);
env->Throw(myExceptionObject);
  

Комментарии:

1. Большое вам спасибо! Я никогда не делал этого из JNI и не был уверен, что это приведет к утечке. :^)

2. Нет проблем! И JNI знает, что это ссылка на объект, и обрабатывает ее как любую другую ссылку на объект. У вас все хорошо.