The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., opennews, 23-Янв-15, 09:53  [смотреть все]
  • Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., Аноним, 09:53 , 23-Янв-15 (1) +5
  • Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., Аноним, 11:35 , 23-Янв-15 (3) –1
  • Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., Аноним, 11:42 , 23-Янв-15 (4) +1
  • Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., Аноним, 06:28 , 25-Янв-15 (9)
  • Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., Ne01eX, 11:40 , 26-Янв-15 (11)
  • Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., Аноним, 01:03 , 02-Фев-15 (14)
    • Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., crystax, 01:20 , 02-Фев-15 (15)
      >[оверквотинг удален]
      > забыть."
      > Но вообще-то, это совсем не так. Стандартный NDK содержит не 2, а
      > 4 реализации STL ( http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html ):
      > - system - та самая обрезаная версия "без всего", которую Вы ошибочно
      > называете GNU libstdc++
      > - gabi++
      > - stlport
      > - gnustl - собственно GNU libstdc++ с полной поддержкой std::thread, std::mutex, std::chrono,
      > и всего остального, что входит в C++11 - при условии выбора
      > соответсвующего toolchain (например, gcc 4.8 или 4.9).

      Это ошибочное представление. "Версии" system/gabi++/stlport я во внимание не принимаю, т.к. system и gabi++ - это вообще даже рядом не "стандартная библиотека C++", а stlport сильно устарела и C++11 возможностей в ней просто нет.

      Так что я говорил о gnustl (GNU libstdc++ - $NDK/sources/cxx-stl/gnu-libstdc++) и libc++ (LLVM libc++ - $NDK/sources/cxx-stl/llvm-libc++). Они обе вполне реализуют то, что требует стандарт C++11 от стандартной библиотеки. Проблема только в том, что конкретно в NDK реализация GNU libstdc++ неполная, а LLVM libc++ - нестабильная.

      Что касается std::mutex и std::thread - то да, они действительно теперь доступны в Google NDK при использовании GNU libstdc++ (gnustl), однако еще совсем недавно они не были доступны. Причины этого - бедная и не соответствующая стандартам libc (Bionic). При сборке GNU libstdc++ запускает много тестов, чтобы проверить, реализована ли на target-системе определенная функциональность и, если нет, отключает все от нее зависящие фичи. Ранее std::thread и std::mutex не работали из-за того, что Bionic не предоставляла pthread_mutex_timedlock(). Сейчас это поправлено, но много других вещей остались неисправленными и далее. Предлагаю открыть файл $NDK/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include/bits/c++config.h и оценить, сколько макросов там не определено, а затем самостоятельно поискать в $NDK/sources/cxx-stl/gnu-libstdc++/4.9/include, что от этих макросов зависит. Например, std::stol.

      LLVM libc++ реализована по другому, поэтому для ее сборки в Google пришлось ее очень сильно покромсать, что плачевно сказалось на ее стабильности. Иными словами, при ее использовании регулярные падения вам обеспечены.

      Мы же в CrystaX NDK исправили очень много низкоуровневых вещей, из-за чего стало возможным а) собрать полноценную GNU libstdc++, в которой все фичи включены и б) собрать LLVM libc++ из upstream исходников, а не покромсанную Google-ом.

      > Так что C++11 доступен в NDK достаточно давно.

      Как видите, это не так. В Google NDK C++11 как язык доступен, но со стандартной библиотекой беда.

      • Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., crystax, 01:33 , 02-Фев-15 (16)
        И кстати - std::chrono в Google NDK более-менее доступен (при использовании), но std::chrono::monotonic_clock, к примеру, не гарантирует монотонности, а просто и тупо является алиасом к std::chrono::system_clock. Как говорится, удачи в отладке. Даже предупреждения не выдается при сборке.

        А в CrystaX NDK std::chrono::monotonic_clock - это честный monotonic clock, на ход времени которого не влияет переустановка системного времени.

        И это только один из множества примеров, когда, чтобы поймать ошибку, приходится отлаживаться не то чтобы часами или днями, но иногда даже неделями - и все только для того, чтобы выяснить, что баг в системной libc или в gnustl. До сих пор вспоминаю, сколько времени пришлось потратить, чтоб в конце концов выяснить, что strtod() не парсит строки "0xNNN", а просто возвращает нуль. Если б хотя бы падала, легче найти причину было бы - но нет, просто 0 на выходе. А чтобы дойти до strtod(), пришлось продраться через огромную гору кода, и затратить на это несколько дней.

        • Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., Аноним, 02:41 , 02-Фев-15 (17)
          • Вышел CrystaX NDK 10.1.0, инструментарий для разработки Andr..., crystax, 02:52 , 02-Фев-15 (18)
            > (спаведливости ради следует отметить, что std::thread и std::mutex работали корректно
            > уже в r9c - в более ранних версиях не пробовал).

            Верно, это я ошибся. Просто я с этим столкнулся намного ранее r9c (еще в r7), и мне немало пришлось потрудиться, чтоб заставить std::thread и std::mutex корректно работать. Ну а сейчас произошла некоторая аберрация памяти и я назвал std::thread/std::mutex в списке недоступных фич.

            > Однако при попытке сделать это ("просто заменить") с проектом с native activity
            > запускаемым через native_app_glue, и использующим минимиум third-party библиотек (Box2D,
            > tinyxml2 и libpng) проект успешно компилируется, однако не запускается на планшете
            > ("...could not load application...").

            Надо просто загрузить libcrystax.so перед загрузкой native activity. Если у вас есть хоть сколько-нибудь Java кода, то проще всего это сделать так:

            static {
                System.loadLibrary("crystax");
            }

            Если же Java нет и добавлять не хочется, то можно:

            - написать свой stub, в котором делать dlopen() для libcrystax.so и затем передавать управление native activity (вот тут это хорошо объясняется: http://stackoverflow.com/questions/12524664/cant-load-native...)

            - либо просто статически слинковаться с libcrystax.a

            > 2. Можно ли слинковать вашу библиотеку libcrystax с программой статически?

            Да, можно. Если используется ndk-build, то просто добавьте в ваш Application.mk:

            APP_LIBCRYSTAX := static




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру