Учимся делать приложения на Java и С++ для Android |
Здравствуйте, гость ( Вход | Регистрация )
Учимся делать приложения на Java и С++ для Android |
17 May 2017, 17:53
(Сообщение отредактировал t800 - 18 May 2017, 18:21)
Сообщение
#1
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Сегодня посоветовал halat перенести его мод на Android и тут подумал, что на форуме даже нет темы в которой можно было бы спрашивать вопросы как это надо программировать под Anroind и поэтому решил такая тема будет полезной. Тем кто решил cделать какую-нибудь приложение на Android сразу могу дать совет: Если вы хотите сделать приложение на Android самое простое это зайти на Github и поискать какие-нибудь исходники с приложением похожим на то что вам надо.
Ну например: В Аndroid есть терминал, но им не очень удобно пользоваться, и поэтому если вы вам надо сделать какие настройки в терминале, то удобней это делать с компьютера по SSH. но для этого нужно на Android поставить специальное приложение SSH сервер, на Google Play таких приложения есть 3 или 4 штуки, но все они какие-то не правильные потому что с рекламой. Поэтому если Вам нужет SSH сервер Вам надо зайти на github и поискать исходники SSH сервера и вы их тут же найдете Вот они https://github.com/stepinto/android-sshd Далее вы должны их скачать и попробовать собрать. Как это делается я расскажу в следующем посте. ЗЫ Сейчас попробую их собрать и если они собирутся, то тогда я напишу как это делается. -------------------- |
|
|
17 May 2017, 19:14
(Сообщение отредактировал t800 - 18 May 2017, 18:22)
Сообщение
#2
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Итак, я попробовал собрать исходники, и при сборке студия мне выдала ошибку:
Цитата Ошибка: выполнение не выполнено для задачи ': app: compileDebugNdk'. > Ошибка: ваш проект содержит файлы C ++, но он не использует поддерживаемую встроенную систему сборки. Подумайте об использовании интеграции CMake или ndk-build со стабильным плагином Android Gradle: https://developer.android.com/studio/projec...ative-code.html Или используйте экспериментальный плагин: http://tools.android.com/tech-docs/new-bui...le-experimental. Я пошёл по первой ссылке из предложенных, и наткнулся на следующее: Цитата Добавление кода C и C ++ в проект Используя Android Studio 2.2 или выше с подключаемым модулем Android для версии Gradle версии 2.2.0 или выше , вы можете добавить код C и C ++ в свое приложение, скомпилировав его в собственную библиотеку, которую Gradle может упаковать с вашим APK. Затем ваш Java-код может вызывать функции в вашей родной библиотеке через Java Native Interface (JNI). Если вы хотите узнать больше об использовании инфраструктуры JNI, прочитайте советы JNI для Android . Инструмент сборки Android Studio по умолчанию для собственных библиотек - CMake. Android Studio также поддерживает ndk-build из-за большого количества существующих проектов, использующих инструментарий сборки для компиляции собственного кода. Если вы хотите импортировать существующую библиотеку ndk-build в свой проект Android Studio, см. Раздел о том, как настроить Gradle для ссылки на вашу родную библиотеку. Однако, если вы создаете новую собственную библиотеку, вы должны использовать CMake. Судя по всему, Android Stidio ругается потому, что CMake не установлен, и нужно поставить именно его. ЗЫ На самом деле оказывается надо поставить еще NDK и LLDB Итак ставим: -------------------- |
|
|
17 May 2017, 21:54
(Сообщение отредактировал t800 - 17 May 2017, 21:57)
Сообщение
#3
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Итак оказалось что CMake тут вообще ни причем. Все дело было в настройках Gradle которые были не правильные
Вот правильные настройки: Код apply plugin: 'com.android.application' dependencies { compile files('libs/bcprov-jdk16-145.jar') compile files('libs/mina-core-2.0.2.jar') compile files('libs/slf4j-android-1.6.1-RC1.jar') compile files('libs/sshd-core-0.5.0.jar') compile files('libs/tomcat-apr-5.5.23.jar') } android { compileSdkVersion 23 buildToolsVersion "25.0.0" defaultConfig { applicationId "org.stepinto.asshd" minSdkVersion 7 targetSdkVersion 7 } sourceSets { main { jni.srcDirs = [] } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } splits { abi { enable true reset() include 'x86', 'armeabi-v7a' universalApk true } } packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/DEPENDENCIES' } } А вот и приложение SSH Сервер собранное для Андрид из исходников -------------------- |
|
|
18 May 2017, 10:23
Сообщение
#4
|
|
[KBK] I'm a Lion Сообщений: 1 265 Спасибо сказали: 893 раза |
Сегодня на хабре увидел статью, подумал может поможет для желающих постичь программирование на андройд. В статье расписано на что стоит обратить внимание, указан минимум знаний при приёме на работу, а так же ссылки на обучающие материалы - ссылка
-------------------- Devil and Angel with me.
|
|
|
18 May 2017, 15:52
(Сообщение отредактировал t800 - 18 May 2017, 16:11)
Сообщение
#5
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Сегодня на хабре увидел статью, подумал может поможет для желающих постичь программирование на андройд. В статье расписано на что стоит обратить внимание, указан минимум знаний при приёме на работу, а так же ссылки на обучающие материалы - ссылка Почитал статью по ссылке. Хммм... Зтот человек который написал статью просмотрел какие то видио уроки, сделал из примеров ОДНО приложение, вызубрил наизусть ответы на вопросы которые задают по Java и пошел устраиваться работать программистом ЗЫ Не знаю какой он программист если он сделал только ОДНО приложение из примеров на JAVA, а до этого как он сам говорит, не написал ни одной строчки кода ни на одном языке программирования. И ИМХО чем зубрить эти 300 ответов на 300 вопросов на которые он дал ссылку лучше бы сделал приложение-шпаргалку с ответами на вопросы, с голосовым поиском и голосовыми подсказками чтобы не зазубривать эти 300 ответов на 300 вопросы которые как он говорит у всех спрашивают. -------------------- |
|
|
18 May 2017, 16:41
(Сообщение отредактировал t800 - 18 May 2017, 18:42)
Сообщение
#6
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
ЗЫ Я тут подумал что раз уж в первом посте мы уже освоили сборку приложения для Андроид из исходников c Github то теперь нам надо наверное сделать то, что так и не сделал автор статьи на харбре который устроился на работу программистом.
А именно: разработать приложение-шапрагалку с ответами на 300 вопросов которые у всех спрашивают. ЗЫ И если получится то и с голосовым поиском и с голосовыми подсказками, чтобы никому больше не нужно было зубрить наизусть эти 300 ответов -------------------- |
|
|
18 May 2017, 18:06
(Сообщение отредактировал t800 - 18 May 2017, 18:25)
Сообщение
#7
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Итак мы решили сделать справочник-шпаргалку с голосовым поиском и чтением ответов-подсказок голосом, чтобы людям которые сдают экзамен на программистов не нужно было зубрить 300 ответов на 300 вопросов, как это делал человек с хабра. Что нам для этого понадобится? Думаете учебник или видио курсы? - А вот и нет нам понадобится - Google! И только он!
Гуглим запрос "голосовое чтениет текста андроид код" и тут же по первой же ссылке находим такой вот код Код import java.util.Locale; import android.app.Activity; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity implements TextToSpeech.OnInitListener { private Button mButton; private TextToSpeech mTTS; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTTS = new TextToSpeech(this, this); mButton = (Button) findViewById(R.id.button1); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String text = "А Васька слушает да ест"; mTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null); } }); } @Override public void onInit(int status) { // TODO Auto-generated method stub if (status == TextToSpeech.SUCCESS) { Locale locale = new Locale("ru"); int result = mTTS.setLanguage(locale); //int result = mTTS.setLanguage(Locale.getDefault()); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e("TTS", "Извините, этот язык не поддерживается"); } else { mButton.setEnabled(true); } } else { Log.e("TTS", "Ошибка!"); } } @Override public void onDestroy() { // Don't forget to shutdown mTTS! if (mTTS != null) { mTTS.stop(); mTTS.shutdown(); } super.onDestroy(); } } ЗЫ Сейчас я его проверю и если код работает отпишусь! -------------------- |
|
|
18 May 2017, 21:51
(Сообщение отредактировал t800 - 18 May 2017, 22:46)
Сообщение
#8
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Так ну код вроде работает
Но вот только с поддержкой русского проблема, причем что забавно проблема имеено в работе TTS от Google INC. У меня на планшете оно все время вылетает, PICO которое не от Google работает почему то нормально, но правда не поддерживат русский. Ну ладно не беда! Опять идем в Google и снова гуглим на этот раз такой запрос: синтезатор речи русский андроид open source github И тут же находим нужные нам исходники - вот они https://github.com/Olga-Yakovleva/RHVoice Тут же их скачиваем и как и в перавом посте импортируем проект в Android Studio (но делать это мы будем завтра потому что уже поздно) -------------------- |
|
|
19 May 2017, 18:39
(Сообщение отредактировал t800 - 19 May 2017, 18:40)
Сообщение
#9
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Итак продолжим делать приложение шпаргалку с головосыми подсказками для программистов
Кстати для приложения нам понадобится иконка, и она будет вот такой: -------------------- |
|
|
19 May 2017, 19:51
Сообщение
#10
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Итак open source сиснтезар с github как я и думал решил нашу проблему и даже не пришлось лезть в код.
Просто оказалось достаточно подгрузить пакет с русским языком. Итак опять собираем наш проект и слушаем чтение русского текста: -------------------- |
|
|
22 May 2017, 07:08
(Сообщение отредактировал t800 - 22 May 2017, 07:11)
Сообщение
#11
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Итак поскольку стало понятно что работа Синтезатор Речи от Google зависит от качества интернета - т.е. если интернета нету от он не работает,
а нам же нужно сделать надежную голосовую шпаргалку! И нам ведь совсем не хочется чтобы в самый ответсвенный момент она вдруг перестала подсказывать потому что интернет отвалился. Поэтому конечно же нам нужен Синтезатор Русской Речи который будет работать без интернета. Поэтому нам надо его такой собрать ОБЯЗАТЕЛЬНО и чтобы он был каждый мог им пользоваться БЕСПЛАТНО и без рекламы. И поскольку он нужент вот вчера я его собрал из исходников немного модифицировал, чтобы он лучше работал с нашей голосовой шпаргалкой, которую мы сейчас делаем и выложил на Google Play Синтезатор Речи https://play.google.com/store/apps/details?...rhvoice.android Пакет Русского Языка https://play.google.com/store/apps/details?...anguage.russian Голос-А женский для синтезатора https://play.google.com/store/apps/details?...roid.voice.anna Голос-В мужской для синтезатора https://play.google.com/store/apps/details?...voice.aleksandr Таким образом теперь мы можем спокойно продолжиьть работу над голосовой шпаргалкой изменать код который выше - теперь он рабоать будет. -------------------- |
|
|
22 May 2017, 20:38
(Сообщение отредактировал t800 - 22 May 2017, 20:40)
Сообщение
#12
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Кстати. Только опубликовал Синтезатор Речи как через полдня пришло письмо от Google Play
Цитата Привет разработчик Богдан Козырев, Благодарим за отправку приложения в Google Play. Я просмотрел Голос B - RHVoice (T-800 Mod), org.kvkozyrev.t800.rhvoice.android.voice.aleksandr и вынужден был отклонить его из-за несанкционированного использования материалов, защищенных авторским правом. Если вы отправили обновление, предыдущая версия вашего приложения все еще находится в Google Play. Вот как вы можете отправить свое приложение на повторную проверку: Удалите из своего приложения контент, принадлежащий третьей стороне. Например, изображения «Александр Демьяненко» в вашем магазине, где перечислены изображения. Прочтите статью «Неавторизованное использование статьи, защищенной авторскими правами», для получения более подробной информации и примеров. Убедитесь, что ваше приложение соответствует политике олицетворения и интеллектуальной собственности и всем другим политикам, перечисленным в политиках программы для разработчиков. Помните, что дополнительные принудительные меры могут возникнуть, если в ваших приложениях возникнут дополнительные проблемы с политикой. Войдите в Play Console и отправьте свое приложение. Что делать, если у меня есть разрешение на использование контента? Свяжитесь с нашей службой поддержки, чтобы предоставить обоснование для ее использования. Обоснование может включать предоставление подтверждения того, что вы уполномочены использовать контент в своем приложении или какое-либо другое юридическое обоснование. Если вы просмотрели политику и считаете, что это отклонение было ошибочным, обратитесь в нашу службу поддержки. Один из моих коллег свяжется с вами в течение двух рабочих дней. Я высоко ценю вашу поддержку Google Play! Лучший, Оскар Команда Google Play Review Пришлось менять все иконки в приложении Были вот такие Стали такие Иконку пришлось редактировать так: отредактировал - загрузил в поиск Google по картинкам если опознала кто на картинке и из какого фильма, опять редактируещь и так пока Google не перестал узнавать. ЗЫ Фух устал! Бороться с google поиском и цвета ему меняешь и фильтры разные наладываещб и размеры - и все равно узнает, помогло только одну искажение по диагонали с поворотом - тогда перестал узнавать. -------------------- |
|
|
23 May 2017, 09:21
Сообщение
#13
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Сегодня посмотрел как на Google Play иконка смотрится - не понравилось. Такое ощущение что человек в голову раненый. Сейчас решил переделать и вот что получилось:
-------------------- |
|
|
01 Jun 2017, 20:25
(Сообщение отредактировал t800 - 01 Jun 2017, 21:15)
Сообщение
#14
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Итак продолжаем учиться делать приложения на Java и C++ для Андроид.
Кстати, в интернете очень многие спрашивают а с чего надо начинать изучение программирование для Андроид. И ответы в интернете на этот вопрос есть разные... Многие советует какие-то умные книжки - кстати - начал я тут читать одну такую умную книжку называется Java - толи для профессионалов, то ли для преподавателей прочитал страниц 50 и понял, почему людям которые читают книжки Hello World пишут только через пол года. ЗЫ И кстати, странно, что только через полгода, ИМХО мне бы наверное и целого года бы не хватило чтобы прочитать такую скучную книжку. Другие советуют начинать изучение с Android Studio и с примеров которые с ней идут и т.д. и т.п. Мой же ответ таков. Первое чему надо научится чтобы делать приложения на С++ для Android - это работать с отладчиком Как это делатся. 1) Вы собрали приложение на С++ - ну хотя бы тот самый Hello World! который вы делали полгода, собрали с ним APK запустли его в эмуляторе, а оно вместо того чтобы нарисовать вам красивый Hello World! вылетело с ошибкой и написало в логах отладчика Android Studio что-то непонятное вроде такого вот: Вот такие вот непонятные надписи, а вам ведь надо понять в какой строчке вашего Hello World написана непонятно какая бяка из-за которой ваше приложение на C++ на Андроид по непонятной причине вылетает, при том что на компьютере, кстати, тот же самый код работает почему то нормально. А чтобы найти эту строчку в вашем исходнике вам надо будет сделать вот что: ЗЫ А что именно для этого надо будет сделать я напишу чуть попозже... -------------------- |
|
|
01 Jun 2017, 21:20
(Сообщение отредактировал t800 - 02 Jun 2017, 22:45)
Сообщение
#15
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Итак продолжим из всего этого непонятного кода нас интересует та его часть где находятся адреса где произошла ошибка в нашем приложении
вот они Код debuggerd: handling request: pid=3694 uid=10094 gid=10094 tid=3713 06-02 00:04:35.174 3716-3716/? A/DEBUG: pid: 3694, tid: 3713, name: GLThread >>> org.kvkozyrev.t800.tallynsyadventure <<< 06-02 00:04:35.179 3716-3716/? A/DEBUG: #00 pc 0005417f /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN11TileManager12load_tilesetESs+1567) 06-02 00:04:35.179 3716-3716/? A/DEBUG: #01 pc 0005490e /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN11TileManagerC1Ev+142) 06-02 00:04:35.179 3716-3716/? A/DEBUG: #02 pc 0001e25d /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_Z7gettileff+141) 06-02 00:04:35.179 3716-3716/? A/DEBUG: #03 pc 0001e2ab /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_Z7issolidff+43) 06-02 00:04:35.179 3716-3716/? A/DEBUG: #04 pc 0003fc00 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN6Player9on_groundEv+64) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #05 pc 0003fe22 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN6Player23handle_horizontal_inputEv+242) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #06 pc 0004057e /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN6Player12handle_inputEv+30) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #07 pc 00040e9f /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN6Player6actionEd+911) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #08 pc 000587f3 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN5World6actionEd+51) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #09 pc 00056636 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_Z9draw_demoP11GameSessiond+230) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #10 pc 00056bb2 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_Z5titlev+1234) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #11 pc 0004faa4 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (SDL_main+356) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #12 pc 00000dcd /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libsdl_main.so (Java_org_kvkozyrev_t800_tallynsyadventure_DemoRenderer_nativeInit+845) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #13 pc 0004281c /data/app/org.kvkozyrev.t800.tallynsyadventure-1/oat/x86/base.odex (offset 0x41000) 0005417f 0005490e 0001e25d 0001e2ab 0003fc00 Ну и так далее... Теперь далаем следующее: Отркрываем в терминале редакторе файл Код nano ~/.bashrc И втавляем в него такую строчку Код alias addr2line_x86='~/android/android-ndk-r12/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-addr2line' После чего закрываем терминал, запускаем его заново и даем такую вот команду Код addr2line_x86 -h Если все получилось номанольно то команда должна вывести следующее: Код Usage: /home/danya/android/android-ndk-r12/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-addr2line [option(s)] [addr(s)] Convert addresses into line number/file name pairs. If no addresses are specified on the command line, they will be read from stdin The options are: @<file> Read options from <file> -a --addresses Show addresses -b --target=<bfdname> Set the binary file format -e --exe=<executable> Set the input file name (default is a.out) -i --inlines Unwind inlined functions -j --section=<name> Read section-relative offsets instead of addresses -p --pretty-print Make the output easier to read for humans -s --basenames Strip directory names -f --functions Show function names -C --demangle[=style] Demangle function names -h --help Display this information -v --version Display the program's version Потом даем команду Код addr2line_x86 -p -f -e project/libs/x86/libapplication.so 0005417f И получаем следующий ответ Код ZN11TileManager12load_tilesetESs at /src/tile.cpp:142 (discriminator 1) Где tile.cpp - это файл исходника где произошка ошибка а 142 это строчка на которой она произошла Так же определяем и другие строки Код для 0005490e _ZN11TileManagerC2Ev at /src/tile.cpp:49 (discriminator 3) для 0001e25d _ZN11TileManager8instanceEv at /src/tile.h:112 (discriminator 2) для 0001e2ab _Z7issolidff at /src/collision.cpp:250 для 0003fc00 _ZN6Player9on_groundEv at /src/player.cpp:277 для 0004057e _ZN6Player23handle_horizontal_inputEv at /src/player.cpp:337 для 00040e9f _ZN6Player6actionEd at /src/player.cpp:173 для 000587f3 _ZN5World6actionEd at /src/world.cpp:263 для 00056636 _Z9draw_demoP11GameSessiond at /src/title.cpp:219 для 00056bb2 _Z5titlev at /src/title.cpp:300 для 0004faa4 SDL_main at /src/tallynsyadventure.cpp:60 для 00000dcd Java_org_kvkozyrev_t800_tallynsyadventure_DemoRenderer_nativeInit at ../jni/sdl_main/sdl_main.c:155 А после этого начинаем думать из-за какой же строчки в коде произошла ошибка чтобы ее можно было исправить. -------------------- |
|
|
02 Jun 2017, 16:53
Сообщение
#16
|
|
Сообщений: 445 Спасибо сказали: 1624 раза |
Кстати, в интернете очень многие спрашивают а с чего надо начинать изучение программирование для Андроид. Как обычно - с базовых понятий об ОСи, под которую программируешь... -------------------- Если тебе стыдно, что ты Русский - не стыдись! Ты не Русский!
|
|
|
02 Jun 2017, 20:19
Сообщение
#17
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20581 раз |
Цитата Как обычно - с базовых понятий об ОСи, под которую программируешь... Какое интересное мнение.
|
|
|
02 Jun 2017, 22:41
(Сообщение отредактировал t800 - 02 Jun 2017, 22:43)
Сообщение
#18
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Итак продолжаем учится делать природения на С++ для Анроид.
Мы нашли наши строчки кода на которых произошла ошибка Цитата #include "tile.h" #include "scene.h" #include "assert.h" TileManager* TileManager::instance_ = 0; std::set<TileGroup>* TileManager::tilegroups_ = 0; Tile::Tile() { } Tile::~Tile() { for(std::vector<Surface*>::iterator i = images.begin(); i != images.end(); ++i) { delete *i; } for(std::vector<Surface*>::iterator i = editor_images.begin(); i != editor_images.end(); ++i) { delete *i; } } //--------------------------------------------------------------------------- TileManager::TileManager() { //t800 // std::string filename = datadir + "/images/tilesets/tallynsy.stgt"; std::string filename = "data/images/tilesets/tallynsy.stgt"; //t800 // Второй вылет здесь это строчка 49 load_tileset(filename); } TileManager::~TileManager() { for(std::vector<Tile*>::iterator i = tiles.begin(); i != tiles.end(); ++i) { delete *i; } } void TileManager::load_tileset(std::string filename) { if(filename == current_tileset) return; // free old tiles for(std::vector<Tile*>::iterator i = tiles.begin(); i != tiles.end(); ++i) { delete *i; } tiles.clear(); lisp_object_t* root_obj = lisp_read_from_file(filename); if (!root_obj) st_abort("Couldn't load file", filename); if (strcmp(lisp_symbol(lisp_car(root_obj)), "tallynsy-tiles") == 0) { lisp_object_t* cur = lisp_cdr(root_obj); int tileset_id = 0; while(!lisp_nil_p(cur)) { lisp_object_t* element = lisp_car(cur); if (strcmp(lisp_symbol(lisp_car(element)), "tile") == 0) { Tile* tile = new Tile; tile->id = -1; tile->solid = false; tile->brick = false; tile->ice = false; tile->water = false; tile->fullbox = false; tile->distro = false; tile->goal = false; tile->data = 0; tile->next_tile = 0; tile->anim_speed = 25; LispReader reader(lisp_cdr(element)); assert(reader.read_int("id", &tile->id)); reader.read_bool("solid", &tile->solid); reader.read_bool("brick", &tile->brick); reader.read_bool("ice", &tile->ice); reader.read_bool("water", &tile->water); reader.read_bool("fullbox", &tile->fullbox); reader.read_bool("distro", &tile->distro); reader.read_bool("goal", &tile->goal); reader.read_int("data", &tile->data); reader.read_int("anim-speed", &tile->anim_speed); reader.read_int("next-tile", &tile->next_tile); reader.read_string_vector("images", &tile->filenames); reader.read_string_vector("editor-images", &tile->editor_filenames); for(std::vector<std::string>::iterator it = tile-> filenames.begin(); it != tile->filenames.end(); ++it) { Surface* cur_image; tile->images.push_back(cur_image); tile->images[tile->images.size()-1] = new Surface( //t800 // datadir + "/images/tilesets/" + (*it), "data/images/tilesets/" + (*it), USE_ALPHA); } for(std::vector<std::string>::iterator it = tile->editor_filenames.begin(); it != tile->editor_filenames.end(); ++it) { Surface* cur_image; tile->editor_images.push_back(cur_image); tile->editor_images[tile->editor_images.size()-1] = new Surface( //t800 // datadir + "/images/tilesets/" + (*it), "data/images/tilesets/" + (*it), USE_ALPHA); } if (tile->id + tileset_id >= int(tiles.size()) ) tiles.resize(tile->id + tileset_id+1); // ВЫЛЕТАЕТ ЗДЕСЬ это строчка 142 tiles[tile->id + tileset_id] = tile; } else if (strcmp(lisp_symbol(lisp_car(element)), "tileset") == 0) { LispReader reader(lisp_cdr(element)); std::string filename; reader.read_string("file", &filename); //t800 // filename = datadir + "/images/tilesets/" + filename; filename = "data/images/tilesets/" + filename; load_tileset(filename); } else if (strcmp(lisp_symbol(lisp_car(element)), "tilegroup") == 0) { TileGroup new_; LispReader reader(lisp_cdr(element)); reader.read_string("name", &new_.name); reader.read_int_vector("tiles", &new_.tiles); if(!tilegroups_) tilegroups_ = new std::set<TileGroup>; tilegroups_->insert(new_).first; } else if (strcmp(lisp_symbol(lisp_car(element)), "properties") == 0) { LispReader reader(lisp_cdr(element)); reader.read_int("id", &tileset_id); tileset_id *= 1000; } else { puts("Unhandled symbol"); } cur = lisp_cdr(cur); } } else { assert(0); } lisp_free(root_obj); current_tileset = filename; } void Tile::draw(float x, float y, unsigned int c, Uint8 alpha) { if (c != 0) { Tile* ptile = TileManager::instance()->get©; if(ptile) { if(ptile->images.size() > 1) { ptile->images[( ((global_frame_counter*25) / ptile->anim_speed) % (ptile->images.size()))]->draw(x,y, alpha); } else if (ptile->images.size() == 1) { ptile->images[0]->draw(x,y, alpha); } else { //printf("Tile not dravable %u\n", c); } } } } void Tile::draw_stretched(float x, float y, int w, int h, unsigned int c, Uint8 alpha) { if (c != 0) { Tile* ptile = TileManager::instance()->get©; if(ptile) { if(ptile->images.size() > 1) { ptile->images[( ((global_frame_counter*25) / ptile->anim_speed) % (ptile->images.size()))]->draw_stretched(x,y,w,h, alpha); } else if (ptile->images.size() == 1) { ptile->images[0]->draw_stretched(x,y, w, h, alpha); } else { //printf("Tile not dravable %u\n", c); } } } } // EOF // Очень хотелось бы услышать мнения почему программа собранная под Андроид на этих строчках (строчки ВЫДЕЛЕНЫ жирным) вылетает А собранная из этих же исходников на Linux и Виндоуз работает нормально -------------------- |
|
|
03 Jun 2017, 18:18
(Сообщение отредактировал t800 - 03 Jun 2017, 18:21)
Сообщение
#19
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Так открлючил эту строчку на которую думал что она виновата
Но программа все равно вылетает с той же самой ошибкой но ругается теперь на другие функции. Вот как было в прошлый раз Код debuggerd: handling request: pid=3694 uid=10094 gid=10094 tid=3713 06-02 00:04:35.174 3716-3716/? A/DEBUG: pid: 3694, tid: 3713, name: GLThread >>> org.kvkozyrev.t800.tallynsyadventure <<< 06-02 00:04:35.179 3716-3716/? A/DEBUG: #00 pc 0005417f /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN11TileManager12load_tilesetESs+1567) 06-02 00:04:35.179 3716-3716/? A/DEBUG: #01 pc 0005490e /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN11TileManagerC1Ev+142) 06-02 00:04:35.179 3716-3716/? A/DEBUG: #02 pc 0001e25d /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_Z7gettileff+141) 06-02 00:04:35.179 3716-3716/? A/DEBUG: #03 pc 0001e2ab /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_Z7issolidff+43) 06-02 00:04:35.179 3716-3716/? A/DEBUG: #04 pc 0003fc00 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN6Player9on_groundEv+64) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #05 pc 0003fe22 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN6Player23handle_horizontal_inputEv+242) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #06 pc 0004057e /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN6Player12handle_inputEv+30) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #07 pc 00040e9f /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN6Player6actionEd+911) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #08 pc 000587f3 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_ZN5World6actionEd+51) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #09 pc 00056636 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_Z9draw_demoP11GameSessiond+230) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #10 pc 00056bb2 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (_Z5titlev+1234) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #11 pc 0004faa4 /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libapplication.so (SDL_main+356) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #12 pc 00000dcd /data/app/org.kvkozyrev.t800.tallynsyadventure-1/lib/x86/libsdl_main.so (Java_org_kvkozyrev_t800_tallynsyadventure_DemoRenderer_nativeInit+845) 06-02 00:04:35.180 3716-3716/? A/DEBUG: #13 pc 0004281c /data/app/org.kvkozyrev.t800.tallynsyadventure-1/oat/x86/base.odex (offset 0x41000) А вот как стало сейчас Код 06-03 21:10:41.426 5654-5675/org.kvkozyrev.t800.tallynsy A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 5675 (GLThread) [ 06-03 21:10:41.426 1185: 1185 W/ ] debuggerd: handling request: pid=5654 uid=10076 gid=10076 tid=5675 06-03 21:10:41.485 5681-5681/? A/DEBUG: pid: 5654, tid: 5675, name: GLThread >>> org.kvkozyrev.t800.tallynsy <<< 06-03 21:10:41.491 5681-5681/? A/DEBUG: #00 pc 0001db72 /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_Z20collision_object_mapRK9base_type+274) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #01 pc 000168ac /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_ZN6BadGuyC2Eff10BadGuyKindb+508) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #02 pc 0005a8d4 /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_ZN5World11add_bad_guyEff10BadGuyKindb+84) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #03 pc 0005a98f /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_ZN5World17activate_bad_guysEv+111) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #04 pc 0005b92c /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_ZN5WorldC1ERKSs+460) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #05 pc 0001f395 /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_ZN11GameSession13restart_levelEv+757) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #06 pc 0001f47a /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_ZN11GameSessionC2ERKSsii+186) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #07 pc 0006067a /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_ZN10WorldMapNS8WorldMap6updateEf+490) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #08 pc 0006124d /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_ZN10WorldMapNS8WorldMap7displayEv+589) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #09 pc 0004b4f9 /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_Z22process_load_game_menuv+313) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #10 pc 00058213 /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (_Z5titlev+1523) 06-03 21:10:41.491 5681-5681/? A/DEBUG: #11 pc 00050fe4 /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libapplication.so (SDL_main+356) 06-03 21:10:41.492 5681-5681/? A/DEBUG: #12 pc 00000dcd /data/app/org.kvkozyrev.t800.tallynsy-1/lib/x86/libsdl_main.so (Java_org_kvkozyrev_t800_tallynsy_DemoRenderer_nativeInit+845) 06-03 21:10:41.492 5681-5681/? A/DEBUG: #13 pc 0004281c /data/app/org.kvkozyrev.t800.tallynsy-1/oat/x86/base.odex (offset 0x41000) ЗЫ Честно говоря я уже совсем запутался из-за каких же строчек она вылетает ЗЗЫ Кстати под Linux и в том и другом случае программа работает нормально. -------------------- |
|
|
08 Jun 2017, 07:22
(Сообщение отредактировал t800 - 08 Jun 2017, 07:28)
Сообщение
#20
|
|
Разработчик Сообщений: 534 Спасибо сказали: 221 раз |
Итак как вы помните в прошлый раз мы остановились на том что нашли строчки на которых наша программа вылетала.
Вчера я решил вплотную заняться этими строчками, как вы помните эти строчки были: строчка 142 в файле tile.cpp и строчка 112 в файле tile,h на котрой было написано следующее: Цитата else { // Never return 0, but return the 0th tile instead so that // user code doesn't have to check for NULL pointers all over // the place return tiles[0]; } И в примечании к этой строчке было написно следующее: Никогда не возвращайте 0, но вместо этого возвращайте 0-ю плиту, чтобы Пользовательский код не должен проверять указатели NULL на всем протяжении место Однако при всем при этом программа на этом месте вылетала, тогда я подумал и решил, что если тот кто написал эту строчку зачем-то ведь к ней приписал что она не должна возвращать 0, надо наверное попробовать что будет если она все-таки 0 вернет и я поменял ее вот так: Цитата else { // Never return 0, but return the 0th tile instead so that // user code doesn't have to check for NULL pointers all over // the place // // return tiles[0]; // //Примечание от t-800 c retun tiles[0]; выслетало, поэтому поставил return 0; return 0; } Собрал программу и запустил. Под Linux ничего не изменилось, но под Андроид программа хоть и продолжила вылетать, НО перестала вылетать на этой строчке! и таким образом у нас осталось только одна проблемная строчка в файле tile.cpp Цитата if (tile->id + tileset_id >= int(tiles.size())) tiles.resize(tile->id + tileset_id+1); tiles[tile->id + tileset_id] = tile; Я ее по разному менял, но программа все равно вылетала, тогда я решил посмотреть в дебагере чему на этой строчке равны tile->id и tileset_id и для этого изменил код вот так: Код if (tile->id + tileset_id >= int(tiles.size())) { int t800_id; t800_id = tile->id + tileset_id+1; tiles.resize(t800_id); int t800_id_2; t800_id_2 = tile->id + tileset_id; tiles[t800_id_2] = tile; } И тут! Наконец-то прогамма вдруг перестала вылетать под Андроид правда Лисенок почему-то проваливатеся через экран и играть поэтому невозможно, но программа вылетать перестала! -------------------- |
|
|
Текстовая версия | Сейчас: 29 March 2024 - 08:22 |
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |