¿Cómo implementar mbtowc para android? (O, idealmente, ¿cómo no hacerlo?)

Estoy intentando construir una aplicación de Android que hace uso de la serialización de impulso. He construido la biblioteca contra NDK r8d usando el brazo 4.7 g ++. Cuando voy a compilar mi código nativo en una biblioteca usando ndk-build, sin embargo, obtengo "referencia indefinida a 'mbtowc'" y "referencia indefinida a 'wctomb'" cuando el compilador intenta vincular algún código de encabezados de archivo en boost .

Parece que no puedo obtener una respuesta clara sobre si el NDK soporta estas funciones.

Aunque implementa las funciones, el CrystaX NDK no es una opción, ya que ha conocido fallos al utilizarlo con Boost, de acuerdo con la lista de correo de Boost.

Por lo tanto, si el NDK no implementar estas funciones de alguna manera, ¿por qué NDK-build no puede vincular contra ellos? Puedo encontrar una referencia a ellos en cstdlib dentro de la NDK, y creo que puede haber una bandera que tengo que establecer, pero no estoy seguro de cómo o dónde hacerlo.

Si no hay implementación de ellos, ¿alguien tiene algún consejo sobre cómo puedo escribir ellos mismo? Sé más o menos lo que mbtowc y su complemento se supone que hacer, pero sin mucha experiencia escribiendo bajo nivel C, y sin mucho conocimiento de la arquitectura de Android / ARM, realmente podría utilizar algunos consejos sobre hacerlo.

 #ifdef ANDROID int wctomb(char *s, wchar_t wc) { return wcrtomb(s,wc,NULL); } int mbtowc(wchar_t *pwc, const char *s, size_t n) { return mbrtowc(pwc, s, n, NULL); } #endif 

¡Recomendaciones! Sí, boost tiene opciones para construirlo sin necesidad de soporte wchar añadiendo definiciones de preprocesador a los scripts de creación de impulso. Boost todavía se bloquea cuando se construye utilizando ellos en la línea de código donde intento serializar un objeto a archivo. (El bloqueo es un genérico segfault en 0x00000000, y no pude obtener ninguna información útil).

Por lo tanto, no me he molestado en escribir wctomb o su inversa. No debería necesitar, es la respuesta a mi pregunta, aunque al final la respuesta a la pregunta no importa.

Para aclarar más: no se moleste en hacer lo que he estado tratando de hacer. Si ha estado utilizando la biblioteca de serialización de Boost y desea que su código se ejecute en android ndk r8d o anterior, simplemente abandone. Escriba un serializador usted mismo, porque no hay información útil que se encuentra en cómo hacer Serialization trabajo. Esperemos que un futuro lanzamiento de la ndk corrige este problema, pero por ahora no tengo más remedio que reescribir todo.

Yo tuve el mismo problema. Estaba creando un puerto androide para el código que utiliza boost :: serialization.

Mi código falló al compilar debido a falta de implementación de mbtowc / wctomb (mb: multi-byte (char), wc: (wide-char) '

La implementación de estas funciones probablemente será una causa difícil, por lo que sé que el ancho-char para android es un solo byte char en lugar de un verdadero carácter ancho.

Sin embargo, cuando compilé impulso con -DBOOST_NO_STD_WSTRING los errores de enlace desaparecieron y podría utilizar boost::archive::text_iarchive & boost::archive::text_oarchive en android.

Ahora estoy serializando contenedores STL de numerics y std :: strings sin problema.

He compilado el impulso para Android siguiendo el consejo en este enlace: http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

Estoy usando boost-1.55_0 y NDK r9c.

<compileflags>-DBOOST_NO_STD_WSTRING el siguiente <compileflags>-DBOOST_NO_STD_WSTRING al comando build para construir una biblioteca de serialización sin soporte de caracteres amplios.

  • Edición de edificio de Gradle
  • Android: Calling System.loadLibrary () hace que el proceso muera
  • ¿Qué es crtbegin.o y crtbegin_dynamic.o?
  • Cómo llamar a un método Java desde C ++ / JNI que toma un parámetro de Contexto de Android
  • Conversión YUV a RGB y visualización utilizando opengl es 2.0 de android ndk usando shaders
  • Soporte de versiones de Android para notificaciones push
  • ¿Es posible realizar llamadas de OpenGL ES desde su código C ++ y Java?
  • NFC API para Android NDK
  • Cómo decodificar datos utilizando Zxing C ++
  • ¿Es compatible con POSIX para Android?
  • ¿Cómo acceder a OpenGL ES 2 a través de C ++ / NDK si EGL_NATIVE_RENDERABLE no es compatible?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.