Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Compilación de STXXL bajo Android NDK r8b

Estoy tratando de compilar STXXL bajo Android NDK r8b (tengo el mismo problema en el nuevo rtc r8c).

Estoy compilando usando gnustl_static.

Necesito la ayuda de C ++ 11 así que inicialmente intenté fijar

LOCAL_CPPFLAGS := -std=c++11 

Pero esto lanzó un error sobre uint64_t.

Así que cambié la bandera a

 LOCAL_CPPFLAGS :=-std=gnu++11 

Esto ayuda a un poco justo, pero cuando empieza a compilar tengo un error en relación con el 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 

También obtengo una carga completa más errores relacionados con este parámetro _Arg.

Así que mirando el primero la función se parece a la siguiente:

 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); } 

Realmente no puedo entender dónde está el problema. ¿Es gnu ++ 11 no definir __GXX_EXPERIMENTAL_CXX0X__ ? ¿O es el problema que no está siendo utilizado en algún lugar correctamente? Estoy muy confundido en cuanto a lo que está causando el problema? Tengo compilación STXXL con gnu ++ 11 bajo clang en el iphone, pero supongo que el iphone es probablemente utilizando una aplicación STL diferente. ¿Alguien tiene alguna idea sobre cómo puedo solucionar este problema?

¡Si usted necesita cualquier Info adicional apenas pide!

Edit: Así que más allá de uno de los comentarios aquí es mi application.mk

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

Y este es mi 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: Curiosamente, sólo intenté colocar una #error temp dentro del bloque #ifdef __GXX_EXPERIMENTAL_CXX0X__ en la función stl_tree.h que posteé. El compilador no lanzar un error en esa parte … por lo que el define nunca se establece que es, presumiblemente, la causa de mis problemas. También he añadido específicamente un -D__GXX_EXPERIMENTAL_CXX0X__ pero eso no hace ninguna diferencia (es como si se obtiene undef'd).

One Solution collect form web for “Compilación de STXXL bajo Android NDK r8b”

Creo que su enfoque para construir es demasiado optimista. No sé nada acerca de STXXL, pero cualquier proyecto no trivial tiene un montón de detalles en sus propios archivos, por lo que lanzando su propio Android.mk y tratando de incluir todos los posibles archivos de código fuente para construir no debería funcionar.

Si desea utilizar ndk-build, debe estudiar cuidadosamente el proyecto y comprender sus detalles e incorporarlos a su nuevo archivo Android.mk. Por ejemplo, si comprueba external directorio external bajo el repositorio de Android ( en github se enumeran como varios subproyectos ), puede ver muchos proyectos de código abierto y cómo se introducen en el sistema de compilación de Android.

Después de un mensaje largo y aburrido, lo que sugeriría es usar NDK como una cadena de herramientas independiente. Puede leer acerca de este $NDK/docs/STANDALONE-TOOLCHAIN.html . En resumen, pude compilar STLXX como una biblioteca estática a través del comando siguiente (mi ndk fue instalado en ~ / bin)

NDK = ~ / bin / android-ndk-r8c PTHREAD_FLAG = COMPILER = "$ NDK / toolchains / arm-linux-androideabi-4.6 / preinstalado / linux-x86 / bin / arm-linux-androideabi-g ++ –sysroot = $ NDK / Plataformas / android-14 / arch-arm -I $ NDK / fuentes / 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 ++

Al principio la compilación falla con un problema en el archivo ./io/ufs_file_base.cpp . Hay algunos usos obsoletos de S_IREAD y S_IWRITE que no es compatible con Android / Bionic. Consulte el informe de errores y la referencia .

Debe actualizar la línea 88 como se indica a continuación

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

entonces

 <same build command again> 

Ahora debes obtener libstxxl.a bajo lib . No sé si esto es realmente funciona o no, pero ya que esta era una cuestión de construcción, espero que responde o le da algunas direcciones.

Una última nota es sobre ARM EABIs. Por encima del comando utiliza armeabi como se puede ver en los directorios especificados, es posible que desee utilizar armeabi-v7a si es aplicable a su destino ya que es más reciente. De sus mensajes de error puedo ver que la construcción en particular estaba apuntando xscale , si eso no es intencional podría ser una buena idea familiarizarse con ARM arquitectura / familias de productos.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.