Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов JNI из С++ 
:(
    Опции темы
belka139
  Дата 24.11.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.11.2009

Репутация: нет
Всего: нет



Возник вопрос, что возвращает метод jni CallObjectMethod, если в java коде вывалилось какое-нибудь исключение? сохраняет ли он где-нибудь log вызовов?

вот код вызова java-ского метода

Код

jclass clsObjService = findClass(env, "ru/spb/nicetu/common/interaction/_1/ObjectOperationsPortImplService");
jmethodID constrObjService = findMethod(env, clsObjService, "<init>", NO_PARAMS,
sizeof(NO_PARAMS), "V");
jmethodID methodGetObjPort = findMethod(env, clsObjService, "getObjectOperationsPortPort",
NO_PARAMS, sizeof(NO_PARAMS),
"Lru/spb/nicetu/common/interaction/_1/ObjectOperationsPort");
jobject objService = env->NewObject(clsObjService, constrObjService);
jobject objPort = env->CallObjectMethod(objService, methodGetObjPort); 



было выяснено, что вне зависимости от того , что будет стоять в качестве второго параметра функции CallObjectMethod, в объект jobject все равно что-то возвращается, каким образом определить с каким успехом отработала эта функция?


PM MAIL ICQ   Вверх
AlexeyVorotnikov
Дата 25.11.2009, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 1
Всего: 18



Вот здесь написано про обработку исключений в нативном коде. В двух словах, после вызова CallObjectMethod следует вызвать ExceptionOccurred или ExceptionCheck.



--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
belka139
Дата 25.11.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.11.2009

Репутация: нет
Всего: нет



попробовала использоать  ExceptionOccured, но тем не менее, когда  я вызываю функцию CallObjectMethod, и в качестве параметров передаю объект одного класса, а метод другого класса - никакого  исключения не ловится, интересно было бы узнать почему , вот пример кода
Код

 jclass clsInfoService = findClass(env, "ru/spb/nicetu/common/interaction/_1/OperationsInfoPortImplService");
    jmethodID constrInfoService = findMethod(env, clsInfoService, "<init>", NO_PARAMS,
         sizeof(NO_PARAMS), "V");
    jmethodID methodGetInfoPort = findMethod(env, clsInfoService, "getOperationsInfoPortPort",
         NO_PARAMS, sizeof(NO_PARAMS),
         "Lru/spb/nicetu/common/interaction/_1/OperationsInfoPort");

    jobject infoService = env->NewObject(clsInfoService, constrInfoService);
    jobject infoPort = env->CallObjectMethod(infoService, methodGetInfoPort);

    if ( infoPort )
     cout << "getInfoPort SUCCEED" << endl;
    else
     cerr << "getInfoPort FAILED" << endl;

    jclass clsObjService = findClass(env, "ru/spb/nicetu/common/interaction/_1/ObjectOperationsPortImplService");
    exc = env->ExceptionCheck();
        if(exc){
         cout<<"Exception was found"<<endl;}
    jmethodID constrObjService = findMethod(env, clsObjService, "<init>", NO_PARAMS,
         sizeof(NO_PARAMS), "V");
    jmethodID methodGetObjPort = findMethod(env, clsObjService, "getObjectOperationsPortPort",
         NO_PARAMS, sizeof(NO_PARAMS),
         "Lru/spb/nicetu/common/interaction/_1/ObjectOperationsPort");
    jobject objService = env->NewObject(clsObjService, constrObjService);

//вот здесь  вызывается метод и   заведомо известно, что он относится к классу 
//OperationsInfoPortImplService , а не к классу ObjectOperationsPortImplService, но exc  все равно остается NULL :(((

    jobject objPort = env->CallObjectMethod(objService, methodGetInfoPort);

    exc = env->ExceptionCheck();
    if(exc){
     cout<<"Exception was found"<<endl;
       }



PM MAIL ICQ   Вверх
AlexeyVorotnikov
Дата 25.11.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 1
Всего: 18



Вообще говоря, вызывать для объекта одного класса метод от другого класса чревато smile
В доке по JNI говориться, что внутри JNI функций никаких проверок не производится, и ответственность за правильность параметров целиком лежит на программисте.
Цитата
The JNI does not check for programming errors such as passing in NULL pointers or illegal argument types. Illegal argument types includes such things as using a normal Java object instead of a Java class object. The JNI does not check for these programming errors for the following reasons:

    * Forcing JNI functions to check for all possible error conditions degrades the performance of normal (correct) native methods.
    * In many cases, there is not enough runtime type information to perform such checking.

Most C library functions do not guard against programming errors. The printf() function, for example, usually causes a runtime error, rather than returning an error code, when it receives an invalid address. Forcing C library functions to check for all possible error conditions would likely result in such checks to be duplicated--once in the user code, and then again in the library.

The programmer must not pass illegal pointers or arguments of the wrong type to JNI functions. Doing so could result in arbitrary consequences, including a corrupted system state or VM crash. 



--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
belka139
Дата 25.11.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.11.2009

Репутация: нет
Всего: нет



все эти эксперименты с вызовами несуществующих в классах методов начались тогда, когда я не смогла вызвать один из существующих методов в классе, хотя jar-ка  в  опциях запуска виртуальной машины была подключена, не находился класс, содержащий метод.
Я стала смотреть , а находятся ли те классы, от которых тот отнаследован, и  на определеном уровне нашла место в иерархии наследования, где  классы перестаюн находиться, но непонятно почему,  и я экспериментальным способом стала выяснять, не импортируются  ли в код класса те классы,jar-ки которых не подключены,и на этапе эекспериментов выяснила, что вне зависимости с правильными параметрами вызывается метод класса или нет, результат один и тот же, объект jobject возвращается :(((
PM MAIL ICQ   Вверх
belka139
Дата 25.11.2009, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.11.2009

Репутация: нет
Всего: нет



А если попытать из  jni вызвать конструктор  класса java который является protected, jni -тоже не выдаст никакой ошибки?
PM MAIL ICQ   Вверх
AlexeyVorotnikov
Дата 26.11.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 1
Всего: 18



Цитата(belka139 @  25.11.2009,  19:19 Найти цитируемый пост)
все эти эксперименты с вызовами несуществующих в классах методов начались тогда, когда я не смогла вызвать один из существующих методов в классе, хотя jar-ка  в  опциях запуска виртуальной машины была подключена, не находился класс, содержащий метод.
Я стала смотреть , а находятся ли те классы, от которых тот отнаследован, и  на определеном уровне нашла место в иерархии наследования, где  классы перестаюн находиться, но непонятно почему,  и я экспериментальным способом стала выяснять, не импортируются  ли в код класса те классы,jar-ки которых не подключены,и на этапе эекспериментов выяснила, что вне зависимости с правильными параметрами вызывается метод класса или нет, результат один и тот же, объект jobject возвращается :((( 

Честно говоря, никогда не сталкивался с таким поведением JNI. Кстати, а что за объект тогда возвращается?

Цитата(belka139 @  25.11.2009,  21:21 Найти цитируемый пост)
А если попытать из  jni вызвать конструктор  класса java который является protected, jni -тоже не выдаст никакой ошибки?

Наверное, стоит поэкспериментировать и посмотреть под отладчиком, что же там всё-таки происходит.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java tools & IDE's | Следующая тема »


 




[ Время генерации скрипта: 0.0871 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.