>я как раз заканчиваю порт игры с айфона на андроид
>тетрис? :D
>И что? Думаешь это делает тебя особенным?
Ну особенным или не особенным, но тешу себя что в разработки игр под андроид уж что-то понимаю.
>Что с ним случится, о каких гарантиях речь идет?
>Гарантии насчет NDK, внимательней читать нужно.
>The NDK will not benefit most applications. As a developer, you need to balance its benefits against its drawbacks; >notably, using native code does not result in an automatic performance increase, but always increases application >complexity. In general, you should only use native code if it is essential to your application, not just because you prefer to >program in C/C++.
>А про JNI, вот именно.
>Это убогий стандарт который не менялся 10 лет,
>к тому же андроид реализация - кривая и нестабильная,
>может себя некорректно вести, и при этом даже не выдаст
>тебе в лог ничего. Практически с нулевой документацией.
>И программа на аднроиде это в первую очередь activity, и API доступный с далвика.
>Давай, покажи мне серьезное взаимодействие кода на С++, с activity через JNI,
>без оверхеда и лишнего копирования.
Ой ты господи.
Ну прочитал абзац - ухты, надаже я и не знал, что программа на двух языках более сложна чем на одном.
Про некоретное поведение, прошу примеры - в лог все выдается, даже номер строки где падение произошло в нативном коде узнать можно.
А то что оно "not benefit most applications", но мы не о most application говорим. Мы о играх говорим.
Серьезное взаимодейсвие звучит то конечно страшно.
Да и без оверхеда не получится конечно.
Но что впрочем игры делать не мешает.
Программа на андроиде на чистой яве это в первую очередь ограничение в 24 мега памяти (а то и 16).
Особенно забавно на планшетах, где одна полноэкраная текстура в памяти весит 3 мега.
Но нет, 24 мегабайта достаточно всем, и это при двух гигах на борту.
И еще я с удовольсвием посмотрю как ты на java с opengl графикой без мемори ликов будешь работать.
Или как на полноэкранную картинку попиксельный фильтр накладывть, для антиальязинга например (знаешь приятно получить прирост скорости на порядок)
Ну и много подобного.
Так что я лучше оверхед потерплю, чем из сотен мегабайт буду ограничиватся 24 мегами, и получать постоянные тормоза от мемори ликов.
Вообщем использование c++ при написании игр на андроиде к сожалению необходимость.
И хорошо что это понимает гугл, иначе зачем основные изменения в 2.3 коснулись как раз расширения api доступного из нативного кода.
И вот хочу у тебя спросить, как ты думаешь почему angry bird, при их доходах и возможностях, в андроид версии cpp кода (скомпилированного!) на два порядка больше чем java кода?
Или хочешь еще какие нибудь топовые новые игры разберем?
вообще работать с етим ндк просто ужасна неудобно, чего стоит візов какой нибудь функции из джавы
50 строчек кода что б вызвать функцию :)
Управление ресурсами - звуком (хотя его под ндк без джавы поднимали) видеокамерой (в теории поднимается но у меня неодин формат так и не поддержаляс из ндк) пришлось помучаться что бы вытянуть нужную инфу джавы, что бы портировать туда готовый движек. Еще написал шеллскрипт для генерирования мейкфайлов и все стало в шоколаде, правда компилится ужасно меделнно особено луабайнд и ОДЕ :)
Еще проблема не смог с помощью цмейка разрулить компиляцию.
Короче порог вхождения довольно высокий, гугл все сделали для того что бы просто народ писал какието тяжелые штуки типа имаейдж процесинга на с++ и быстренько вызывал патом это из джава кода для профита, и не более.
Ну какие 50 строчек? Ну откуда?
r = gJavaVM->AttachCurrentThread(&envCurrent, 0);
if (r == 0)
{
cls = envCurrent->FindClass("com.bla.bla.SoundManager");
js = envCurrent->NewStringUTF(GetFName());
mid = envCurrent->GetStaticMethodID(cls, "playSound", "(Ljava/lang/String;)V");
envCurrent->CallStaticVoidMethod(cls, mid, js);
} else
{
LOGI("Error: AttachCurrentThread return %i, envCurrent %i\n", r, envCurrent);
}
И это только потому что лениво нормальный макрос написать, или вообще шаблонный класс.
ну вот уже не верно :)
Атачится не всегда надо, необходимо проверять.
Также необходимо тут еще пару ифов что б все проверить и написать сообщение об ошибке внятное, ато ваще обічна когда в с++ чтото падает далеко не всегда понятно через джаву что и где.
Да и еще DetachCurrentThread пропустил в конце :) вот о чем я и говорил, написал кусок кода и там несколько ошибок сразу.
Можно и проверять, а можно и аттачится.
Кстати с удовольсвием посмотрю, на ваш кусок кода со всеми проверками.
Деаттач я просто не докопировал.
Посмотреть где убало в нативном коде, с точностью до строки можно через "arm-eabi-addr2line.exe -C -f -e " кстати - мало ли кому пригодится.
static void javaCallbackTest(const char *s) { int status; JNIEnv *env; bool isAttached = false; status = g_javaVM->GetEnv( ( void **)&env, JNI_VERSION_1_6); if ( status < 0 ) { LOG( logs::e_logic, logs::el_message, "failed to GetEnv here", "" ); status = g_javaVM->AttachCurrentThread( &env, NULL); if ( status < 0 ) { LOG( logs::e_logic, logs::el_message, "failed to get AttachCurrentThread", "" ); return; } isAttached = true; } jstring js = env->NewStringUTF( s); jclass interfaceClass = env->GetObjectClass( g_interfaceObject); if ( !interfaceClass) { LOG( logs::e_logic, logs::el_message, "failed to get GetObjectClass", "" ); if ( isAttached) g_javaVM->DetachCurrentThread( ); return; } jmethodID method = env->GetStaticMethodID( interfaceClass, "callBack", "(Ljava/lang/String;)V" ); if ( !method) { LOG( logs::e_logic, logs::el_message, "failed to get getStaticMethodID", "" ); if ( isAttached) g_javaVM->DetachCurrentThread( ); return; } env->CallStaticVoidMethod( interfaceClass, method, js); if ( isAttached) g_javaVM->DetachCurrentThread( ); }
вот как бы так вышло пока
В последнем NDK (r5) можно все в нативе писать, какие мысли по этому поводу?
Еще не пробовал, но судя по описанию сугубо положительные. Как и введение нативной поддержки звука из-под NDK. Если бы последний проект бы делал сразу под r5 то много гемора бы избежал был.
Young
> Про некоретное поведение, прошу примеры - в лог все выдается, даже номер строки
> где падение произошло в нативном коде узнать можно.
Как ты этого добился? У меня при падении пишет крешдамп какой-то с регистрами, а про файл/номер строки ни слова :((
Значит так. Ну если по простому.
Находим в логе строчки вида
#00 pc 0000XXXX somelib.so
#01 pc 0000XXXX somelib.so
#02 pc 0000XXXX somelib.so
#03 pc 0000XXXX otherlib.so
Это наш стек.
Далее идем в ndk-sdk и запускаем
build\prebuilt\windows\arm-eabi-4.4.0\bin\arm-eabi-addr2line.exe -C -f -e somelib.so
Там вбиваем адрес который стоит после pc
Если либа будет дебажная (брать в obj\local\armeabi\ и впроекте, или в зависимости от настроек) - то получаем имя метода и строчку.
Если более сложно, то нужно патчить вывод adb, смотреть там появление таких строк и делать вызов автоматом и подменять вывод.
О, круто, спасибо :) А то printf'ом дебажить это ужос =\
Ну все таки нативная активити работает с андроидом 2.3+ то есть планы на будущее.
Есть ли вообще смысл движок писать полностью на нативе, или от явовсого лаунчера лучше не отказываться?
>Программа на андроиде на чистой яве это в первую очередь ограничение в 24 мега памяти (а то и 16).
>Особенно забавно на планшетах, где одна полноэкраная текстура в памяти весит 3 мега.
>Но нет, 24 мегабайта достаточно всем, и это при двух гигах на борту.
NDK разве позволяет обойти это ограничение?
Max_XT
> NDK разве позволяет обойти это ограничение?
да
> Есть ли вообще смысл движок писать полностью на нативе, или от явовсого лаунчера лучше не отказываться?
конкретно сейчас думаю смысла рыпаться нету в принципе, т.к. нет рынка девайсов с 2.3. Когда их действительно станет много, можно и переписать.. но зачем?) если уже будет движок с корректной поддержкой life-cycle через JNI.
если терзает сомнительный аргумент вроде "оптимизации", то нужно проектировать библиотеку таким образом, чтобы код достаточно было поменять в сильно локализованном участке кода. я, как фанат, могу порекомендовать OpenKODE спеку:)
Посмотрел презентацию Криса Пруетта (Chris Pruett) "Google I/O 2010 - Writing real-time games for Android redux", и там он говорит что нативный рендер не намного быстрее чем через Java. Сейчас изучаю Replica Island, поразительное быстродействие даже на эмуляторе, и никакого натива (правда там ничего кроме логики и рендера и нет).
Поэтому вопрос более продвинутым, что именно писать в native коде? Реализацию физики?
Gordon, ссылки про использование OpenKODE под Android не посоветуешь?
Если вы пишите opengl игру с нуля только под платформу android и она потребляет меньше 24 мегов памяти то большого смысла заморачиватся с нативным кодом нет - можно писать и на java.
Тема в архиве.