Compilation de STXXL sous Android NDK r8b

J'essaie de compiler STXXL sous Android NDK r8b (j'ai le même problème sous le nouveau r8c btw).

Je compile en utilisant gnustl_static.

  • Calling finish () sur une activité Android ne termine pas réellement
  • Gestion des connexions SQLite dans Android
  • Android - comment définir ShapeDrawables par programme?
  • Comment développer une application Android native hors ligne
  • Comment puis-je installer la même application Android .apk deux fois sur le même périphérique?
  • Cocos2d-x android ne peut pas résoudre la bibliothèque coscos2dx
  • J'ai besoin du support C ++ 11 alors j'ai essayé initialement

    LOCAL_CPPFLAGS := -std=c++11 

    Mais cela a provoqué une erreur sur uint64_t.

    J'ai donc changé le drapeau

     LOCAL_CPPFLAGS :=-std=gnu++11 

    Cela aide un bon morceau, mais quand il commence à se compiler, j'ai une erreur concernant le gnu stl.

     Users/Gozzeh/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/stxxl/STXXL/algo/copy_and_sort_file.od -fpic -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -I/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include -I/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/include -Ijni -DANDROID -Wa,--noexecstack -fexceptions -frtti -Dnullptr=0 -D_ANDROID -std=gnu++11 -Ijni/STXXL/include -fexceptions -O2 -DNDEBUG -g -I/Users/Gozzeh/android-ndk-r8b/platforms/android-8/arch-arm/usr/include -c jni/STXXL/algo/copy_and_sort_file.cpp -o ./obj/local/armeabi/objs/stxxl/STXXL/algo/copy_and_sort_file.o In file included from /Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/set:60:0, from jni/STXXL/include/stxxl/bits/io/simdisk_file.h:33, from jni/STXXL/include/stxxl/bits/io/io.h:20, from jni/STXXL/include/stxxl/io:13, from jni/STXXL/algo/copy_and_sort_file.cpp:18: /Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h: In member function 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Base_ptr, std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Base_ptr, const _Val&)': /Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h:1011:39: error: '_Arg' was not declared in this scope 

    Je reçois également plus d'erreurs liées à ce paramètre _Arg.

    Donc, en regardant le premier, la fonction ressemble à la suivante:

     template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> #ifdef __GXX_EXPERIMENTAL_CXX0X__ template<typename _Arg> #endif typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: #ifdef __GXX_EXPERIMENTAL_CXX0X__ _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, _Arg&& __v) #else _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, const _Val& __v) #endif { bool __insert_left = (__x != 0 || __p == _M_end() || _M_impl._M_key_compare(_KeyOfValue()(__v), _S_key(__p))); // This line is the error location. _Link_type __z = _M_create_node(_GLIBCXX_FORWARD(_Arg, __v)); _Rb_tree_insert_and_rebalance(__insert_left, __z, const_cast<_Base_ptr>(__p), this->_M_impl._M_header); ++_M_impl._M_node_count; return iterator(__z); } 

    Je ne peux pas vraiment comprendre où le problème se pose. Gnu ++ 11 ne définit pas __GXX_EXPERIMENTAL_CXX0X__ ? Ou est-ce que le problème n'est pas utilisé quelque part correctement? Je suis très confus quant à ce qui cause le problème? J'ai compilé STXXL avec gnu ++ 11 sous clang sur l'iphone, mais je suppose que l'iPhone utilise probablement une autre implémentation STL. Est-ce que quelqu'un a eu des idées sur la façon dont je peux résoudre ce problème?

    Si vous avez besoin d'informations supplémentaires, demandez simplement!

    Edit: Donc, plus loin à l'un des commentaires ici est my application.mk

     APP_PLATFORM := android-8 APP_STL := gnustl_static APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti APP_OPTIM := release APP_ABI := all 

    Et c'est mon android.mk:

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) rwildcard = $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) LOCAL_MODULE := stxxl LOCAL_CPP_FEATURES += exceptions FILE_LIST := $(call rwildcard, $(LOCAL_PATH)/STXXL/,*.cpp) LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_CPPFLAGS := -Dnullptr=0 -D_ANDROID -D__STDC_INT64__ -std=gnu++11 -I$(LOCAL_PATH)/STXXL/include include $(BUILD_SHARED_LIBRARY) 

    Edit: Fait intéressant, j'ai simplement essayé de placer une #error temp dans le bloc #ifdef __GXX_EXPERIMENTAL_CXX0X__ dans la fonction stl_tree.h que j'ai posté. Le compilateur ne lance PAS une erreur sur cette partie … donc la définition ne se met jamais en place qui est vraisemblablement la cause de mes problèmes. J'ai également ajouté spécifiquement un -D__GXX_EXPERIMENTAL_CXX0X__ mais cela ne fait aucune différence (c'est comme si cela ne se faisait pas).

  • Android: désactivez l'application pour la tablette
  • Comment résoudre le problème «Entrez le mot de passe pour le stockage des informations d'identification»?
  • Impossible de trouver Facebook SDK.apk
  • Comment puis-je antialiser la limite du clip sur la toile de Android?
  • Un moyen approprié de disposer des écrans dans Libgdx
  • Vue OpenGL dans une mise en page
  • One Solution collect form web for “Compilation de STXXL sous Android NDK r8b”

    Je pense que votre approche à construire est trop optimiste. Je ne sais rien au sujet de STXXL, mais tout projet non trivial a beaucoup de détails dans leurs propres fichiers de création, alors en lançant votre propre Android.mk et en essayant d'inclure tous les fichiers de code source possibles à construire, ne devrait pas fonctionner.

    Si vous souhaitez utiliser ndk-build, vous devriez étudier attentivement le projet et comprendre ses détails et les intégrer à votre nouveau fichier Android.mk. Par exemple, si vous vérifiez le répertoire external sous le référentiel Android ( dans github ils sont répertoriés comme plusieurs sous-projets ), vous pouvez voir de nombreux projets open source et comment ils sont introduits dans le système de construction Android.

    Après un message long et ennuyeux, ce que je suggère, c'est d'utiliser NDK comme une chaîne d'outils autonome. Vous pouvez lire à propos de ce $NDK/docs/STANDALONE-TOOLCHAIN.html . En bref, j'ai pu compiler STLXX comme bibliothèque statique via la commande ci-dessous (mon ndk a été installé à ~ / bin)

    NDK = ~ / bin / android-ndk-r8c PTHREAD_FLAG = COMPILER = "$ NDK / toolchains / arm-linux-androideabi-4.6 / prebuilt / linux-x86 / bin / arm-linux-androideabi-g ++ –sysroot = $ NDK / Plates-formes / android-14 / arch-arm -I $ NDK / sources / cxx-stl / gnu-libstdc ++ / 4.6 / include -I $ NDK / sources / cxx-stl / gnu-libstdc ++ / 4.6 / libs / armeabi / include -L $ NDK / sources / cxx-stl / gnu-libstdc ++ / 4.6 / libs / armeabi / -lgnustl_shared "make library_g ++

    Au début, la construction échoue avec un problème dans le fichier ./io/ufs_file_base.cpp . Il existe certaines utilisations obsolètes de S_IREAD et S_IWRITE qui ne sont pas compatibles avec Android / Bionic. Voir rapport de bug et référence .

    Vous devriez mettre à jour la ligne 88 comme ci-dessous

     const int perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; 

    puis

     <same build command again> 

    Maintenant, vous devriez obtenir libstxxl.a sous lib . Je ne sais pas si cela fonctionne vraiment ou non, mais comme il s'agissait d'une question de construction, j'espère qu'il répond ou vous donne quelques indications.

    Une dernière note concerne les EABI ARM. La commande ci-dessus utilise armeabi comme vous pouvez le voir dans les répertoires spécifiés, vous voudrez peut-être utiliser armeabi-v7a si applicable à votre cible car c'est plus récent. À partir de vos messages d'erreur, je peux voir que cette compilation particulière ciblait xscale , si ce n'est pas intentionnel, cela pourrait être une bonne idée de se familiariser avec l'architecture ARM / les familles de produits.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.