#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 знает, что это ссылка на объект, и обрабатывает ее как любую другую ссылку на объект. У вас все хорошо.