141. [warning] Особенности написания ANE для Android

Warning – Стоп! Будьте внимательны, впереди аварийно опасный код.
Посмотреть все статьи серии: http://flashpress.ru/blog/category/warning/
Android – Все о разработке для Android, в том числе про нативные расширения ANE
http://flashpress.ru/blog/category/mobile/android/

Друг, если когда нибудь ты захочешь написать ANE для Android, помни что если ты создал переменную Boolean value и не задал значение(true или false), тогда проверять if(value) нельзя, потому что Google скажет “ой все” и закроет приложение !!!

Не знаю, может быть это какая то особенность java, но я убил на это 2 часа дописывая последние штрихи своей первой ANE для Android, вот этой вот http://flashpress.ru/blog/ane/audience-network/ :)

Кстати бага воспроизводится как в ANE, так и в нативном приложении в Android Studio. Создал пустое приложение:

И оно падает с ошибкой (обратите внимание на строку 16):

Android – Все о разработке для Android, в том числе про нативные расширения ANE
http://flashpress.ru/blog/category/mobile/android/
Warning – Стоп! Будьте внимательны, впереди аварийно опасный код.
Посмотреть все статьи серии: http://flashpress.ru/blog/category/warning/

Помните, баги не дремлют!
Serious Sam
Эту статью прочитали 1354 раз

Возникли вопросы по статье? Не стесняйтесь спрашивать в комментариях или любым другим способом на странице Контакты .

Присоединяйтесь к нам в социальных сетях: ВКонтакте , Twitter и Facebook
Понравилась статья? Буду благодарен если вы поделитесь ссылкой с друзьями:


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




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




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


  1. Владимир

    Ну еще бы оно не падало. Я вот не знаю Java, но и то по сообщению догадался, что Boolean – это объект, и он null, потому что вы его не создали. А если хочется нормальный простой тип, а не объект, то это наверняка какой-нибудь bool или boolean.

    1. Serious Sam Автор записи

      Этот блог в первую очередь для Flash-программистов, а для флешера описанная проблема оочень не очевидная. Потому что во флеше переменную любого типа(Boolean, Object, BitmapData …) можно так проверять. Во флеше тоже есть переменная типа Boolean, и если явно не инициализировать переменную, она по умолчанию имеет значение false, а Object получает значение null – в обоих случаях проверка if(value) не приведет к ошибке и тем более к краху приложения.

      И еще, проверил сейчас на java такую же конструкцию с переменной типа Dictionary, и приложение не падает. Где логика?

      1. AiDiod

        Ваш враг – неявные приведения типов. Во флеше оно сплошь и рядом, например, null неявно всегда приводится в false. В языках, где неявного приведения нужно указывать сравнение, то есть myVar != null. Вы не можете без кастинга привести int к double и так далее. Ну и второе – это значение переменной по умолчанию, для экземпляра класса это всегда null, для примитивных типов (в java они пишутся с строчной буквы) они такие же как и во флеше (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html).

  2. AiDiod

    Кстати, по поводу нпе в случае Boolean, тут есть небольшая хитрость, для поддержки дженериков в java были добавлены классы для примитивных типов и для них неявно вызывается getValue() что с вами и произошло, но так как экземпляр не был инициализирован – то вы получили нпе

    1. Serious Sam Автор записи

      Интересное и полезное замечание. Спасибо за разъяснение, вот теперь понятно почему приложение падает с Boolean, но не падает с другими типами :)