IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Reply to this topicStart new topic
> Учимся делать приложения на Java и С++ для Android
t800
сообщение 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

Далее вы должны их скачать и попробовать собрать. Как это делается я расскажу в следующем посте.

ЗЫ Сейчас попробую их собрать и если они собирутся, то тогда я напишу как это делается.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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

Итак ставим:


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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 Сервер собранное для Андрид из исходников




--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Seiffear
сообщение 18 May 2017, 10:23
Сообщение #4

[KBK] I'm a Lion
Сообщений: 1 265
Спасибо сказали: 893 раза




Сегодня на хабре увидел статью, подумал может поможет для желающих постичь программирование на андройд. В статье расписано на что стоит обратить внимание, указан минимум знаний при приёме на работу, а так же ссылки на обучающие материалы - ссылка


--------------------
Devil and Angel with me.
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 18 May 2017, 15:52 (Сообщение отредактировал t800 - 18 May 2017, 16:11)
Сообщение #5

Разработчик
Сообщений: 534
Спасибо сказали: 221 раз




Цитата(Seiffear @ 18 May 2017, 13:23) *
Сегодня на хабре увидел статью, подумал может поможет для желающих постичь программирование на андройд. В статье расписано на что стоит обратить внимание, указан минимум знаний при приёме на работу, а так же ссылки на обучающие материалы - ссылка


Почитал статью по ссылке. Хммм... Зтот человек который написал статью просмотрел какие то видио уроки, сделал из примеров ОДНО приложение, вызубрил наизусть ответы на вопросы которые задают по Java и пошел устраиваться работать программистом kruto.gif

ЗЫ Не знаю какой он программист если он сделал только ОДНО приложение из примеров на JAVA, а до этого как он сам говорит, не написал ни одной строчки кода ни на одном языке программирования. И ИМХО чем зубрить эти 300 ответов на 300 вопросов на которые он дал ссылку лучше бы сделал приложение-шпаргалку с ответами на вопросы, с голосовым поиском и голосовыми подсказками чтобы не зазубривать эти 300 ответов на 300 вопросы которые как он говорит у всех спрашивают.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 18 May 2017, 16:41 (Сообщение отредактировал t800 - 18 May 2017, 18:42)
Сообщение #6

Разработчик
Сообщений: 534
Спасибо сказали: 221 раз




ЗЫ Я тут подумал что раз уж в первом посте мы уже освоили сборку приложения для Андроид из исходников c Github то теперь нам надо наверное сделать то, что так и не сделал автор статьи на харбре который устроился на работу программистом.

А именно: разработать приложение-шапрагалку с ответами на 300 вопросов которые у всех спрашивают. barb_metal.gif barb_metal.gif barb_metal.gif

ЗЫ И если получится то и с голосовым поиском и с голосовыми подсказками, чтобы никому больше не нужно было зубрить наизусть heat.gif эти 300 ответов brags.gif




--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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();
    }
}


ЗЫ Сейчас я его проверю и если код работает отпишусь!


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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 (но делать это мы будем завтра потому что уже поздно)


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 19 May 2017, 18:39 (Сообщение отредактировал t800 - 19 May 2017, 18:40)
Сообщение #9

Разработчик
Сообщений: 534
Спасибо сказали: 221 раз




Итак продолжим делать приложение шпаргалку с головосыми подсказками для программистов

Кстати для приложения нам понадобится иконка, и она будет вот такой:



--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 19 May 2017, 19:51
Сообщение #10

Разработчик
Сообщений: 534
Спасибо сказали: 221 раз




Итак open source сиснтезар с github как я и думал решил нашу проблему и даже не пришлось лезть в код.
Просто оказалось достаточно подгрузить пакет с русским языком.

Итак опять собираем наш проект и слушаем чтение русского текста:



--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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

Таким образом теперь мы можем спокойно продолжиьть работу над голосовой шпаргалкой изменать код который выше - теперь он рабоать будет.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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 поиском и цвета ему меняешь и фильтры разные наладываещб и размеры - и все равно узнает, помогло только одну искажение по диагонали с поворотом - тогда перестал узнавать.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 23 May 2017, 09:21
Сообщение #13

Разработчик
Сообщений: 534
Спасибо сказали: 221 раз




Сегодня посмотрел как на Google Play иконка смотрится - не понравилось. Такое ощущение что человек в голову раненый. Сейчас решил переделать и вот что получилось:




--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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++ на Андроид по непонятной причине вылетает, при том что на компьютере, кстати, тот же самый код работает почему то нормально.

А чтобы найти эту строчку в вашем исходнике вам надо будет сделать вот что:

ЗЫ А что именно для этого надо будет сделать я напишу чуть попозже...


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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


А после этого начинаем думать из-за какой же строчки в коде произошла ошибка чтобы ее можно было исправить.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
ivyl
сообщение 02 Jun 2017, 16:53
Сообщение #16


Сообщений: 445
Спасибо сказали: 1624 раза




Цитата(t800 @ 01 Jun 2017, 20:25) *
Кстати, в интернете очень многие спрашивают а с чего надо начинать изучение программирование для Андроид.

Как обычно - с базовых понятий об ОСи, под которую программируешь...


--------------------
Если тебе стыдно, что ты Русский - не стыдись! Ты не Русский!
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 02 Jun 2017, 20:19
Сообщение #17

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20581 раз




Цитата
Как обычно - с базовых понятий об ОСи, под которую программируешь...
Какое интересное мнение.
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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 и Виндоуз работает нормально


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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 и в том и другом случае программа работает нормально.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
t800
сообщение 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;
                 }


И тут! Наконец-то прогамма вдруг перестала вылетать под Андроид правда Лисенок почему-то проваливатеся через экран и играть поэтому невозможно, но программа вылетать перестала! barb_metal.gif barb_metal.gif barb_metal.gif


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29 March 2024 - 08:22
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика