1. C++ / Говнокод #11838

    +35

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    void GetDPI ()
    {
    	jclass c; jmethodID m; jobject o, dm; jfieldID fxdpi, fydpi;
    
    	c = env->FindClass		("android/util/DisplayMetrics");
    	m = env->GetMethodID		(c, "<init>", "()V");
    	dm = env->NewObject		(c, m);
    
    	fxdpi = env->GetFieldID		(c, "xdpi", "F");
    	fydpi = env->GetFieldID		(c, "ydpi", "F");
    
    	c = env->FindClass		("android/app/NativeActivity");
    	m = env->GetMethodID		(c, "getWindowManager", "()Landroid/view/WindowManager;");
    	o = env->CallObjectMethod	(appState->activity->clazz, m);
    
    	c = env->GetObjectClass		(o);
    	m = env->GetMethodID		(c, "getDefaultDisplay", "()Landroid/view/Display;");
    	o = env->CallObjectMethod	(o, m);
    
    	c = env->GetObjectClass		(o);
    	m = env->GetMethodID		(c, "getMetrics", "(Landroid/util/DisplayMetrics;)V");
    	o = env->CallObjectMethod	(o, m, dm);
    
    	xdpi = env->GetFloatField	(dm, fxdpi);
    	ydpi = env->GetFloatField	(dm, fydpi);
    	LOGI("dpi is (%f, %f)", xdpi, ydpi);
    }

    Пишем под ведроид, дёргаем жабьи методы
    На жабе:
    DisplayMetrics d = new DisplayMetrics;
    getWindowManager.getDefaultDisplay.getMe trics(d);
    xdpi=d.xdpi;
    ydpi=d.ydpi;

    Запостил: TarasB, 27 Сентября 2012

    Комментарии (61) RSS

    • И чем аргументировал создатель сей подход?
      Ответить
    • Notably, using native code on Android generally does not result in a noticable performance improvement, but it always increases your app complexity. In general, you should only use the NDK if it is essential to your app—never because you simply prefer to program in C/C++.
      Что и требовалось доказать.
      Ответить
      • Я ничего не понял, можно по-русски?
        Ответить
        • Андроид - говно. Плюсы - говно. Ява - выбор успешных потсанчиков.
          Ответить
        • Использование нативного кода на Ведре обычно не даёт заметного повышения производительности, но всегда усложняет приложение. Вам стоит использовать NDK только если оно необходимо приложению, а не просто потому, что вам нравятся крестоблядские крестококомпиляторы.

          А по поводу кода - может быть стоит написать только рендерер на крестах, а всю остальную обвязку на жабе?
          Ответить
          • какой дословный перевод, однако :)
            Ответить
          • Я пишу код кроссплатформенно. Я пишу его в Студии, компилирую как виндовую программу, отлаживаю как виндовую программу. Потом в последний момент пересобираю его эклипсом под ведроид. Так удобнее отлаживать, сами понимаете.
            А ещё при компиляции под ведроид жабья часть ни с того ни с сего протухает, бывает такое, и тогда я удаляю жабью часть, и эклипс её генерирует заново, и я нормально собираю программу.
            Так вот, как все эти удобства получить, пися на двух языках одновременно?
            Ну и ещё я ебал сишарпненькие жабьи парадигмы, типа рахитектур иерархий оопни, исключений, гц. Если ты не индус, то проще без них.
            Ответить
      • Вот кстати был весьма удивлен, когда узнал, что игры для Дроида обычно пишутся на плюсах.
        Ответить
        • Только какая у них переносимость, интересно.
          Ответить
          • Ну, если рассмотреть, скажем, AngryBirds, написанную на движке Box2D (который на С++), то, видимо, неплохая.
            Ответить
          • Переносимость, хахахахаха, я как человек который связан с делом скажу так - переносимость то есть, но она достигается такими уебишьними решениями что, на мой взгляд, проще писать нативно.
            Ответить
            • Я пишу на крестах, компилирую один и тот же код и под винду и под ведроид, как на жабе сделать то же самое, особенно если условной компиляции нет, а андроидные классы использовать приходится?
              Ответить
              • Как разве джаба не супер-трупер кроссплатформенна? Как у вас мог возникнуть такой вопрос вообще?
                Ответить
                • Ну может я чего-то не знаю, но да, меня подзаебали рекламные статейки в стиле орифлейма про то, как жаба ускоряет скорость разработки благодаря гц ооп исключениям и кроссплатформе и какая пиздатая вещь жаба машина.
                  Когда ко мне в первый раз стали про это рассказывать, я уже писал 3Д-игры на турбопасе, поэтому меня всё время мучал вопрос "ну и нахуй это, если и без этого я пишу крутые проги, а не хуйню, считающую 2+2 через пиздатый класс Adder, являющийся наследником класса IntegerOperation"?
                  Ответить
                • > разве джаба не супер-трупер кроссплатформенна
                  Write once, debug everywhere (tm)
                  Ответить
                  • Я только сейчас обратил внимание на второе слово и понял шутку
                    Ответить
              • Я пишу на крестах
                Интересный поворот сюжета, вот этого я ни как не ожидал...
                Ответить
                • Хули делать, когда выбор между жабой и крестами, то есть между говняными парадигмами и говняной реализацией правильных парадигм?
                  Ответить
                  • Портируй на андроид православную Аду (если это еще никто не сделал).
                    Ответить
                    • Ну как бы вроде как линускоиды сделали или что-то такое...
                      Вот ты объясни. Если есть гццшный компилятор Ады под винду, значит есть транслятор из Ады во внутренний гццшный язык, который гцц умеет компилировать под любую платформу, следовательно автоматически существует гцц Ады под ведроид, я правильно понимаю внутреннее устройство гцц?
                      Проблема только в жаваблядском апи.
                      Ответить
                      • Ада не умеет в JNI?
                        Ответить
                        • Я хз, как вообще оно на уровне языка устроено.
                          Под виндой есть языковая конструкция подключения функции из dll, для ведроида видать есть какой-то аналог.
                          Ответить
                      • http://rveenker.home.xs4all.nl/Ada%20on%20Android.html
                        Ответить
                        • > eabi-gnatmake
                          звучит как призыв к действию
                          Ответить
                        • Там какой-то пиздец надо на жабе писать всё равно, студии, делающей это самостоятельно, нету?
                          И желательно пример с графикой.
                          Ответить
                  • Это надо же так изменить идее ради мелочных интересов.
                    Ответить
              • > как на жабе сделать то же самое, особенно если условной компиляции нет, а андроидные классы использовать приходится
                Используй интерфейсы и джавоблядский DI/IoC. Еще в клипсе вроде бы была условная сборка - часть файлов компилится всегда, часть только под заданную платформу.

                Ну а вообще, если на крестах удобнее - спорить не буду.
                Ответить
              • >Я пишу на крестах
                Теперь все срачи между дельфинами и крестушниками о некошерных скобках, о отступах, о компиляторах и всем прочем одним махом разбиваются об это.

                Q.E.D.
                ALL HAIL C++!
                Ответить
                • То, что инфраструктура заточена под говно, не значает, что это говно меньше воняет.
                  Ответить
                  • Правду говрят, что ты ушел в кресты из-за RAИ?
                    Ответить
                    • любовь зла, полюбишь два креста
                      Ответить
                      • Новый бестселлер: "от Ады до РАИ". Спрашивайте в магазинах.
                        Ответить
                        • В Аде нет РАЯ (Русский Алгоритмический Язык)
                          Ответить
                          • Не надо, не надо
                            Ни ада, ни рая
                            И то и другое
                            С тобою бывает

                            Сама полюбила
                            Сама виновата
                            И всё же иного
                            Не надо, не надо
                            Ответить
                    • Откуда?
                      Алё, РАИИ есть и в Дельфи, и в Аде.
                      Ответить
                      • В дельфи есть РАЙ? Не смеши мои тапочки.

                        PS: минуснул не я (
                        Ответить
                        • Есть, не знал? Даже в 7й версии.
                          Минуснул лох какой-то не в теме.
                          Ответить
                          • А в Аде есть Рай?
                            Ответить
                            • И в Аде есть.
                              И в Дельфи есть. Даже в 7й версии. И в Аде тоже есть. И в Дельфи , и в Аде есть РАИИ. РАИИ есть и в Дельфи (даже в 7 версии), и в Аде.
                              Ответить
                              • И даже в крестах!
                                Ответить
                                • Рай в крестах? Это наверное для любителей саги Сумерки.
                                  Ответить
                              • > РАИИ есть и в Дельфи (даже в 7 версии)
                                Костыль для потомков TInterfacedObject, не работающий на остальных потомках TObject?
                                Ответить
                                • Нет, TInterfaced Object не обязателен.
                                  Ответить
                                  • type Test = class(TObject)
                                      ...
                                    end;
                                    
                                    procedure test
                                    var t :Test;
                                    begin
                                        t := Test.Create;
                                    end

                                    Вот тут сработает деструктор? Видимо нет. Так что RAII работает далеко не всегда.

                                    > Нет, TInterfacedObject не обязателен.
                                    Расскажи, какие предъявляются требования к объекту, чтобы он поддерживал RAII.
                                    Ответить
                                    • 1. Да ты бы ещё в крестах память маллоком выделил и удивлялся что она не удаляется.
                                      var t:IInterface - всё удаляется.

                                      > Расскажи, какие предъявляются требования к объекту, чтобы он поддерживал RAII.

                                      Это должна быть переменная типа IInterface. При создании надо указывать конструктора класса-наследника IInterface, этот класс должен поддерживать три метода.
                                      Ответить
                                      • А, понял TInterfaceObject это просто класс для удобства, позволяющий не запиливать эти самые addref и release вручную.

                                        Ну ок, теперь согласен с тем, что в Delphi есть RAII.
                                        Ответить
                                        • Неужели ты проспал эпичные темы, в которых перегружался менеджер памяти так, чтобы при удалении специальным образом составленного фиктивного динмассива вызывался метод по указателю по адресу, лежащем перед массивом?
                                          Ответить
                                          • > Неужели ты проспал эпичные темы
                                            Я же ньюфаг :P
                                            Ответить
                  • Надо написать свою, с блекджеком и развлечениями. Как будто нет компилятора с фрипаскаля.
                    Ответить
                  • О. Мой первый коммент-таки тогда прошел модерацию
                    Еще хотел добавить:

                    Ибо молвил сиё Тарас, пророк Ада. Но веским будто каменная глыба было Его Слово.
                    Не таким как легкомысленное кудахтанье крестушка, разлетевшееся словно брошенные в воздух перья.
                    Ответить
    • Но в чем-то жабоненависника понять можно...
      Ответить
    • Крестобляди получили по заслугам!

      Любить кресты - страшный грех.

      Разрешается любить только жабу!

      Всем любить жабу!!!
      Ответить
    • Id методов и полей в теории можно кешировать, это существенно ускоряет вызов (во всяком случае, так было в JNI).
      Ответить
      • В теории можно написать супер-оптимизатор, который за программиста заменит алгоритм со сложностью O(100500^n) на O(log n). Но это в теории.
        Ответить
      • У меня эта процедура вызывается за всё время работы программы максимум один раз, при первом обращении к xdpi, так что у меня всё закешировано.
        Хотя может быть я индус и андроид внезапно разрешит извне менять разрешение экрана в моём уютненьком нативеактивити и тогда мне пизда.
        Ответить
        • > андроид внезапно разрешит извне менять разрешение экрана в моём уютненьком нативеактивити
          Поворот девайса на 90 градусов?
          Ответить
          • Не, это я зафиксировал, чтобы не париться.
            Ответить
            • Внезапная экранная клавиатура? Ну хотя это игра, и на ее экране нету виджетов, из которых она может вылезти.
              Ответить
    • показать все, что скрытоЭтот чай уникального пурпурного цвета, вот уже более шести тысяч лет выращивается в самых высоких горах на земле - Непале и Тибете и используется в разнообразных медицинских целях, а сейчас засчёт огромного набора полезных свойств заслуженно набирает популярность во всём мире.
      Пурпурный чай - это мощнейший жиросжигатель, который к тому же препятствует возникновению новых отложений, превращая жир в энергию.
      Официальный сайт: http://pur.bxox.info
      Ответить

    Добавить комментарий