Thanks for inspiring! Sorry for being unable to response instantly 'cause we're of diff. semisphere.<br> The android-bluetooth module DOES have glib included, it uses only libglib, and now I've compiled it under android souce into libglib.so,but it's not usable to spice-gtk for it's glib-2.0-20 which cannot afford some methods such as "g_byte_array_unref".etc,and there's none libgio/libgthread/libgmodule which are also needed by spicec-glib or snappy.<br>
As I've mentioned, in running of snappy,the segfault/sigbus comes from libgobj and my patching work is mainly in libgio.<br> And I have found no clue of successful use of libgio..etc. in Android.<br> So now, I suppose the problems are basically from two points:(suppose the spice-gtk has no wrong-use of glib)<br>
1. The compiling fault such as the incorrect alignment setting which is the sin of the sigbus<br>2. The danger in the patching of the definitions from arpa/nameser*.h which may cause segfault.<br> Anybody can give me some instructions of testing libg*?<br>
Appreciating.<br><div class="gmail_quote"> <br>On Mon, Mar 21, 2011 at 6:30 PM, Alon Levy <span dir="ltr"><<a href="mailto:alevy@redhat.com">alevy@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">On Mon, Mar 21, 2011 at 06:13:12PM +0800, Shuxiang Lim wrote:<br>
> Hi, I open this new thread to clearly describe my condition:<br>
><br>
<br>
</div>did you notice the post mentioning glib is actually part of android<br>
since it's used for bluetooth? maybe you can find out which version / where<br>
the headers / libs are and just link with it?<br>
<br>
I am trying to setup an environment according to your instructions but I<br>
don't have any hw to test with. It will take me some time though.<br>
<br>
Alon<br>
<div><div></div><div class="h5"><br>
> 1.I use the android NDK provided by Mozzila which has nearly full C++<br>
> support:<br>
> <a href="http://ftp.mozilla.org/pub/mozilla.org/mobile/source/android-ndk-r4c-0moz3.tar.bz2" target="_blank">http://ftp.mozilla.org/pub/mozilla.org/mobile/source/android-ndk-r4c-0moz3.tar.bz2</a><br>
> and I have modified Andrew Ross's agcc to partner with this NDK:<br>
> <a href="http://blog.csdn.net/rozenix/archive/2011/02/28/6212994.aspx" target="_blank">http://blog.csdn.net/rozenix/archive/2011/02/28/6212994.aspx</a><br>
><br>
> 2. Then I cross compile glib2.28.1 onto Android in this order:<br>
> 1)libiconv-1.13.1.tar.gz:<br>
> configured by:<br>
> *CC=agcc CXX=agcc LD=arm-eabi-ld RANLIB=arm-eabi-ranlib \<br>
> PKG_CONFIG_LIBDIR=/data/local/lib/pkgconfig:/data/local/share/pkgconfig/ \<br>
> ./configure \<br>
> --prefix=/data/local \<br>
> --host=arm-eabi-linux \**<br>
> --enable-malloc0returnsnull \*<br>
> * --enable-shared \*<br>
> 2)gettext-0.18.1.1.tar.gz<br>
> configured by:<br>
> *CC=agcc CPPFLAGS="-I/data/local/include" LDFLAGS="-L/data/local/lib"<br>
> CXX=agcc LD=arm-eabi-ld RANLIB=arm-eabi-ranlib \<br>
> PKG_CONFIG_LIBDIR=/data/local/lib/pkgconfig:/data/local/share/pkgconfig/ \<br>
> ./configure \<br>
> --prefix=/data/local \<br>
> --host=arm-eabi-linux \<br>
> --enable-malloc0returnsnull \<br>
> --enable-shared \<br>
> --cache-file=arm.cache \<br>
> --without-included-regex \<br>
> --disable-java --disable-openmp --without-libiconv-prefix<br>
> --without-libintl-prefix --without-libglib-2.0-prefix<br>
> --without-libcroco-0.6-prefix --with-included-libxml<br>
> --without-libncurses-prefix --without-libtermcap-prefix<br>
> --without-libcurses-prefix --without-libexpat-prefix --without-emacs<br>
> * But the build of gettext will not fully succeed,never mind, I need only<br>
> libintl.so so just make install.<br>
><br>
> 3) glib-2.28.1.tar.gz<br>
> 1st, do patching with my attached file(these are all that I found that have<br>
> to be modified)<br>
> 2nd, write this into the cache file arm.cache:<br>
> *glib_cv_stack_grows=no**<br>
> glib_cv_uscore=no<br>
> ac_cv_func_posix_getpwuid_r=no<br>
> ac_cv_func_posix_getgrgid_r=no*<br>
> 3rd, configured the same as libiconv.<br>
> 4th, remove the -lpthread in gthread/Makefile.<br>
> 5td, make;make install<br>
><br>
> 3. Also I have to port pixman and openssl onto android.<br>
> 1)pixman-0.20.0: config. make;make install same as libiconv<br>
> 2)openssl-1.0.0: config by:<br>
> ./config no-asm shared --prefix=/data/local/<br>
> then modify the Makefile:gcc-->agcc remove the -m64..etc.<br>
> make...<br>
><br>
> 3. So I disable the audio channels and build snappy onto android with this<br>
> script under spice-gtk/gtk:<br>
> #!/bin/bash<br>
> COMMON_DIR=../common<br>
> SPICE_GLIB_SRC="coroutine_gthread.c spice-util.c spice-session.c<br>
> spice-channel.c spice-glib-enums.c spice-marshal.c generated_demarshallers.c<br>
> generated_demarshallers1.c generated_marshallers.c generated_marshallers1.c<br>
> gio-coroutine.c channel-base.c channel-main.c channel-display.c<br>
> channel-display-mjpeg.c channel-cursor.c channel-inputs.c decode-glz.c<br>
> decode-jpeg.c decode-zlib.c $COMMON_DIR/mem.c $COMMON_DIR/marshaller.c<br>
> $COMMON_DIR/canvas_utils.c $COMMON_DIR/sw_canvas.c<br>
> $COMMON_DIR/pixman_utils.c $COMMON_DIR/lines.c $COMMON_DIR/rop3.c<br>
> $COMMON_DIR/quic.c $COMMON_DIR/lz.c $COMMON_DIR/region.c<br>
> $COMMON_DIR/ssl_verify.c"<br>
> CPP_FLAGS="-DHAVE_CONFIG_H -DSW_CANVAS_CACHE -D_REENTRANT -I. -I..<br>
> -I../common -I/data/local/include/spice-1 -I/data/local/include/pixman-1<br>
> -I/data/local/include -I/data/local/include/glib-2.0<br>
> -I/data/local/lib/glib-2.0/include"<br>
> C_FLAGS="-std=gnu99 -Wall -Wno-sign-compare -Wno-deprecated-declarations<br>
> -Wl,--no-undefined -fPIC -DPIC "<br>
> LD_FLAGS="-L/data/local/lib/ -lpixman-1 -lm -lssl -lcrypto -ljpeg -lz<br>
> -lglib-2.0 -lgio-2.0 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 "<br>
> echo "agcc -shared -o libspicec_glib.so $SPICE_GLIB_SRC $CPP_FLAGS $C_FLAGS<br>
> $LD_FLAGS"<br>
> agcc -shared -o libspicec.so $SPICE_GLIB_SRC $CPP_FLAGS $C_FLAGS $LD_FLAGS<br>
> agcc -o snappy spice-cmdline.c snappy.c -DG_LOG_DOMAIN=\"GSpice\"<br>
> -DSW_CANVAS_CACHE -DSPICE_GTK_LOCALEDIR=\"/usr/local/share/locale\"<br>
> $CPP_FLAGS $C_FLAGS $LD_FLAGS -lspicec -lintl -liconv -L./<br>
><br>
> then I put all the snappy,libspicec.so,lib*so onto android dev. and<br>
> reproduce the faults.<br>
> Thanks.<br>
<br>
</div></div>> --- glib-2.28.1/glib/gstrfuncs.c 2011-02-16 10:55:33.000000000 +0800<br>
> +++ aglib-2.28.1/glib/gstrfuncs.c 2011-03-21 16:33:18.000000000 +0800<br>
> @@ -442,8 +442,12 @@ g_ascii_strtod (const gchar *nptr,<br>
><br>
> fail_pos = NULL;<br>
><br>
> +#ifdef ANDROID<br>
> + decimal_point = ".";<br>
> +#else<br>
> locale_data = localeconv ();<br>
> decimal_point = locale_data->decimal_point;<br>
> +#endif<br>
> decimal_point_len = strlen (decimal_point);<br>
><br>
> g_assert (decimal_point_len != 0);<br>
> @@ -656,8 +660,12 @@ g_ascii_formatd (gchar *buffer,<br>
><br>
> _g_snprintf (buffer, buf_len, format, d);<br>
><br>
> +#ifdef ANDROID<br>
> + decimal_point = ".";<br>
> +#else<br>
> locale_data = localeconv ();<br>
> decimal_point = locale_data->decimal_point;<br>
> +#endif<br>
> decimal_point_len = strlen (decimal_point);<br>
><br>
> g_assert (decimal_point_len != 0);<br>
> --- glib-2.28.1/glib/gutils.c 2011-02-11 23:23:13.000000000 +0800<br>
> +++ aglib-2.28.1/glib/gutils.c 2011-03-21 17:08:09.000000000 +0800<br>
> @@ -29,6 +29,9 @@<br>
> */<br>
><br>
> #include "config.h"<br>
> +#ifdef ANDROID<br>
> +#undef HAVE_PWD_H<br>
> +#endif<br>
><br>
> #ifdef HAVE_UNISTD_H<br>
> #include <unistd.h><br>
> --- glib-2.28.1/gio/libasyncns/asyncns.c 2010-04-13 21:33:16.000000000 +0800<br>
> +++ aglib-2.28.1/gio/libasyncns/asyncns.c 2011-03-21 17:11:43.000000000 +0800<br>
> @@ -18,6 +18,30 @@<br>
> <<a href="http://www.gnu.org/licenses/" target="_blank">http://www.gnu.org/licenses/</a>>.<br>
> ***/<br>
><br>
> +#ifdef ANDROID<br>
> +typedef struct {<br>
> + unsigned id :16; /*%< query identification number */<br>
> + /* fields in third byte */<br>
> + unsigned rd :1; /*%< recursion desired */<br>
> + unsigned tc :1; /*%< truncated message */<br>
> + unsigned aa :1; /*%< authoritive answer */<br>
> + unsigned opcode :4; /*%< purpose of message */<br>
> + unsigned qr :1; /*%< response flag */<br>
> + /* fields in fourth byte */<br>
> + unsigned rcode :4; /*%< response code */<br>
> + unsigned cd: 1; /*%< checking disabled by resolver */<br>
> + unsigned ad: 1; /*%< authentic data from named */<br>
> + unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */<br>
> + unsigned ra :1; /*%< recursion available */<br>
> + /* remaining bytes */<br>
> + unsigned qdcount :16; /*%< number of question entries */<br>
> + unsigned ancount :16; /*%< number of answer entries */<br>
> + unsigned nscount :16; /*%< number of authority entries */<br>
> + unsigned arcount :16; /*%< number of resource entries */<br>
> +} HEADER;<br>
> +#endif<br>
> +<br>
> +<br>
> #ifdef HAVE_CONFIG_H<br>
> #include "g-asyncns.h"<br>
> #endif<br>
> @@ -57,6 +81,10 @@<br>
> #include <inttypes.h><br>
> #endif<br>
><br>
> +#ifdef ANDROID<br>
> +#undef HAVE_SYS_PRCTL_H<br>
> +#endif<br>
> +<br>
> #ifdef HAVE_SYS_PRCTL_H<br>
> #include <sys/prctl.h><br>
> #endif<br>
> --- glib-2.28.1/gio/gresolver.c 2011-02-11 23:23:11.000000000 +0800<br>
> +++ aglib-2.28.1/gio/gresolver.c 2011-03-21 16:42:18.000000000 +0800<br>
> @@ -20,6 +20,61 @@<br>
> * Boston, MA 02111-1307, USA.<br>
> */<br>
><br>
> +#ifdef ANDROID<br>
> +/*%<br>
> + * Inline versions of get/put short/long. Pointer is advanced.<br>
> + */<br>
> +#define NS_INT32SZ 4 /*%< #/bytes of data in a u_int32_t */<br>
> +#define NS_INT16SZ 2 /*%< #/bytes of data in a u_int16_t */<br>
> +#define NS_GET16(s, cp) do { \<br>
> + register const u_char *t_cp = (const u_char *)(cp); \<br>
> + (s) = ((u_int16_t)t_cp[0] << 8) \<br>
> + | ((u_int16_t)t_cp[1]) \<br>
> + ; \<br>
> + (cp) += NS_INT16SZ; \<br>
> +} while (0)<br>
> +#define NS_GET32(l, cp) do { \<br>
> + register const u_char *t_cp = (const u_char *)(cp); \<br>
> + (l) = ((u_int32_t)t_cp[0] << 24) \<br>
> + | ((u_int32_t)t_cp[1] << 16) \<br>
> + | ((u_int32_t)t_cp[2] << 8) \<br>
> + | ((u_int32_t)t_cp[3]) \<br>
> + ; \<br>
> + (cp) += NS_INT32SZ; \<br>
> +} while (0)<br>
> +<br>
> +<br>
> +#define GETSHORT NS_GET16<br>
> +#define GETLONG NS_GET32<br>
> +<br>
> +#define ns_c_in 1 /*%< Internet. */<br>
> +#define ns_t_srv 33 /*%< Internet. */<br>
> +#define C_IN ns_c_in<br>
> +#define T_SRV ns_t_srv<br>
> +<br>
> +typedef struct {<br>
> + unsigned id :16; /*%< query identification number */<br>
> + /* fields in third byte */<br>
> + unsigned rd :1; /*%< recursion desired */<br>
> + unsigned tc :1; /*%< truncated message */<br>
> + unsigned aa :1; /*%< authoritive answer */<br>
> + unsigned opcode :4; /*%< purpose of message */<br>
> + unsigned qr :1; /*%< response flag */<br>
> + /* fields in fourth byte */<br>
> + unsigned rcode :4; /*%< response code */<br>
> + unsigned cd: 1; /*%< checking disabled by resolver */<br>
> + unsigned ad: 1; /*%< authentic data from named */<br>
> + unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */<br>
> + unsigned ra :1; /*%< recursion available */<br>
> + /* remaining bytes */<br>
> + unsigned qdcount :16; /*%< number of question entries */<br>
> + unsigned ancount :16; /*%< number of answer entries */<br>
> + unsigned nscount :16; /*%< number of authority entries */<br>
> + unsigned arcount :16; /*%< number of resource entries */<br>
> +} HEADER;<br>
> +#endif<br>
> +<br>
> +<br>
> #include "config.h"<br>
> #include <glib.h><br>
> #include "glibintl.h"<br>
> --- glib-2.28.1/gio/gthreadedresolver.c 2011-02-11 23:23:12.000000000 +0800<br>
> +++ aglib-2.28.1/gio/gthreadedresolver.c 2011-03-21 16:44:29.000000000 +0800<br>
> @@ -20,6 +20,60 @@<br>
> * Boston, MA 02111-1307, USA.<br>
> */<br>
><br>
> +#ifdef ANDROID<br>
> +/*%<br>
> + * Inline versions of get/put short/long. Pointer is advanced.<br>
> + */<br>
> +#define NS_INT32SZ 4 /*%< #/bytes of data in a u_int32_t */<br>
> +#define NS_INT16SZ 2 /*%< #/bytes of data in a u_int16_t */<br>
> +#define NS_GET16(s, cp) do { \<br>
> + register const u_char *t_cp = (const u_char *)(cp); \<br>
> + (s) = ((u_int16_t)t_cp[0] << 8) \<br>
> + | ((u_int16_t)t_cp[1]) \<br>
> + ; \<br>
> + (cp) += NS_INT16SZ; \<br>
> +} while (0)<br>
> +#define NS_GET32(l, cp) do { \<br>
> + register const u_char *t_cp = (const u_char *)(cp); \<br>
> + (l) = ((u_int32_t)t_cp[0] << 24) \<br>
> + | ((u_int32_t)t_cp[1] << 16) \<br>
> + | ((u_int32_t)t_cp[2] << 8) \<br>
> + | ((u_int32_t)t_cp[3]) \<br>
> + ; \<br>
> + (cp) += NS_INT32SZ; \<br>
> +} while (0)<br>
> +<br>
> +<br>
> +#define GETSHORT NS_GET16<br>
> +#define GETLONG NS_GET32<br>
> +<br>
> +#define ns_c_in 1 /*%< Internet. */<br>
> +#define ns_t_srv 33 /*%< Internet. */<br>
> +#define C_IN ns_c_in<br>
> +#define T_SRV ns_t_srv<br>
> +<br>
> + typedef struct {<br>
> + unsigned id :16; /*%< query identification number */<br>
> + /* fields in third byte */<br>
> + unsigned rd :1; /*%< recursion desired */<br>
> + unsigned tc :1; /*%< truncated message */<br>
> + unsigned aa :1; /*%< authoritive answer */<br>
> + unsigned opcode :4; /*%< purpose of message */<br>
> + unsigned qr :1; /*%< response flag */<br>
> + /* fields in fourth byte */<br>
> + unsigned rcode :4; /*%< response code */<br>
> + unsigned cd: 1; /*%< checking disabled by resolver */<br>
> + unsigned ad: 1; /*%< authentic data from named */<br>
> + unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */<br>
> + unsigned ra :1; /*%< recursion available */<br>
> + /* remaining bytes */<br>
> + unsigned qdcount :16; /*%< number of question entries */<br>
> + unsigned ancount :16; /*%< number of answer entries */<br>
> + unsigned nscount :16; /*%< number of authority entries */<br>
> + unsigned arcount :16; /*%< number of resource entries */<br>
> + } HEADER;<br>
> +#endif<br>
> +<br>
> #include "config.h"<br>
> #include <glib.h><br>
> #include "glibintl.h"<br>
> --- glib-2.28.1/gio/gunixresolver.c 2011-02-11 23:23:12.000000000 +0800<br>
> +++ aglib-2.28.1/gio/gunixresolver.c 2011-03-21 16:45:01.000000000 +0800<br>
> @@ -20,6 +20,62 @@<br>
> * Boston, MA 02111-1307, USA.<br>
> */<br>
><br>
> +#ifdef ANDROID<br>
> +/*%<br>
> + * Inline versions of get/put short/long. Pointer is advanced.<br>
> + */<br>
> +#define NS_INT32SZ 4 /*%< #/bytes of data in a u_int32_t */<br>
> +#define NS_INT16SZ 2 /*%< #/bytes of data in a u_int16_t */<br>
> +#define NS_GET16(s, cp) do { \<br>
> + register const u_char *t_cp = (const u_char *)(cp); \<br>
> + (s) = ((u_int16_t)t_cp[0] << 8) \<br>
> + | ((u_int16_t)t_cp[1]) \<br>
> + ; \<br>
> + (cp) += NS_INT16SZ; \<br>
> +} while (0)<br>
> +#define NS_GET32(l, cp) do { \<br>
> + register const u_char *t_cp = (const u_char *)(cp); \<br>
> + (l) = ((u_int32_t)t_cp[0] << 24) \<br>
> + | ((u_int32_t)t_cp[1] << 16) \<br>
> + | ((u_int32_t)t_cp[2] << 8) \<br>
> + | ((u_int32_t)t_cp[3]) \<br>
> + ; \<br>
> + (cp) += NS_INT32SZ; \<br>
> +} while (0)<br>
> +<br>
> +<br>
> +#define GETSHORT NS_GET16<br>
> +#define GETLONG NS_GET32<br>
> +<br>
> +#define ns_c_in 1 /*%< Internet. */<br>
> +#define ns_t_srv 33 /*%< Internet. */<br>
> +#define C_IN ns_c_in<br>
> +#define T_SRV ns_t_srv<br>
> +<br>
> + typedef struct {<br>
> + unsigned id :16; /*%< query identification number */<br>
> + /* fields in third byte */<br>
> + unsigned rd :1; /*%< recursion desired */<br>
> + unsigned tc :1; /*%< truncated message */<br>
> + unsigned aa :1; /*%< authoritive answer */<br>
> + unsigned opcode :4; /*%< purpose of message */<br>
> + unsigned qr :1; /*%< response flag */<br>
> + /* fields in fourth byte */<br>
> + unsigned rcode :4; /*%< response code */<br>
> + unsigned cd: 1; /*%< checking disabled by resolver */<br>
> + unsigned ad: 1; /*%< authentic data from named */<br>
> + unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */<br>
> + unsigned ra :1; /*%< recursion available */<br>
> + /* remaining bytes */<br>
> + unsigned qdcount :16; /*%< number of question entries */<br>
> + unsigned ancount :16; /*%< number of answer entries */<br>
> + unsigned nscount :16; /*%< number of authority entries */<br>
> + unsigned arcount :16; /*%< number of resource entries */<br>
> + } HEADER;<br>
> +#endif<br>
> +<br>
> +<br>
> +<br>
> #include "config.h"<br>
> #include <glib.h><br>
> #include "glibintl.h"<br>
> --- glib-2.28.1/gio/glocalfileinfo.c 2011-02-11 23:23:11.000000000 +0800<br>
> +++ aglib-2.28.1/gio/glocalfileinfo.c 2011-03-21 16:55:10.000000000 +0800<br>
> @@ -1096,7 +1096,11 @@ lookup_uid_data (uid_t uid)<br>
> if (pwbufp->pw_name != NULL && pwbufp->pw_name[0] != 0)<br>
> data->user_name = convert_pwd_string_to_utf8 (pwbufp->pw_name);<br>
><br>
> +#ifdef ANDROID<br>
> + gecos = NULL;<br>
> +#else<br>
> gecos = pwbufp->pw_gecos;<br>
> +#endif<br>
><br>
> if (gecos)<br>
> {<br>
> --- glib-2.28.1/gio/ginetaddress.c 2011-02-11 23:23:11.000000000 +0800<br>
> +++ aglib-2.28.1/gio/ginetaddress.c 2011-03-21 16:55:45.000000000 +0800<br>
> @@ -20,6 +20,27 @@<br>
> * Authors: Christian Kellner <<a href="mailto:gicmo@gnome.org">gicmo@gnome.org</a>><br>
> * Samuel Cormier-Iijima <<a href="mailto:sciyoshi@gmail.com">sciyoshi@gmail.com</a>><br>
> */<br>
> +#ifdef ANDROID<br>
> +#define IN6_IS_ADDR_MC_NODELOCAL(a) \<br>
> + (IN6_IS_ADDR_MULTICAST(a) \<br>
> + && ((((__const uint8_t *) (a))[1] & 0xf) == 0x1))<br>
> +<br>
> +#define IN6_IS_ADDR_MC_LINKLOCAL(a) \<br>
> + (IN6_IS_ADDR_MULTICAST(a) \<br>
> + && ((((__const uint8_t *) (a))[1] & 0xf) == 0x2))<br>
> +<br>
> +#define IN6_IS_ADDR_MC_SITELOCAL(a) \<br>
> + (IN6_IS_ADDR_MULTICAST(a) \<br>
> + && ((((__const uint8_t *) (a))[1] & 0xf) == 0x5))<br>
> +<br>
> +#define IN6_IS_ADDR_MC_ORGLOCAL(a) \<br>
> + (IN6_IS_ADDR_MULTICAST(a) \<br>
> + && ((((__const uint8_t *) (a))[1] & 0xf) == 0x8))<br>
> +<br>
> +#define IN6_IS_ADDR_MC_GLOBAL(a) \<br>
> + (IN6_IS_ADDR_MULTICAST(a) \<br>
> + && ((((__const uint8_t *) (a))[1] & 0xf) == 0xe))<br>
> +#endif<br>
><br>
> #include <config.h><br>
><br>
<br>
> _______________________________________________<br>
> Spice-devel mailing list<br>
> <a href="mailto:Spice-devel@lists.freedesktop.org">Spice-devel@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/spice-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/spice-devel</a><br>
<br>
</blockquote></div><br>