Hello to all friends of Gnash!
I'm proud and fortunate to be enrolled in the mailing list for I'm now
trying to port Redhat SPICE client on to Android.
It's TOUGH,and you Gnash-android-porting guys will definitely agree with
this. the Spice client is written in C++, but even I can overcome the C++
support problem in Android,I still have to move to the spicec version
written in C/GTK because C is more 'safer' in Android than C++, and anyway
the UI of it must be inevitably rewrote in JAVA.
But now comes the glib problems in porting to android. I referenced the
instructions in
http://wiki.gnashdev.org/AndroidDependencies
and I met more troubles in glib building(so I need to write a patch)
1.I use the android NDK provided by Mozzila which has nearly full C++
support:
http://ftp.mozilla.org/pub/mozilla.org/mobile/source/android-ndk-r4c-0moz3.tar.bz2
and I have modified Andrew Ross's agcc to partner with this NDK:
http://blog.csdn.net/rozenix/archive/2011/02/28/6212994.aspx
2. Then I cross compile glib2.28.1 onto Android in this order:
1)libiconv-1.13.1.tar.gz: **
2)gettext-0.18.1.1.tar.gz*
* But the build of gettext *has not fully succeed*ed,never mind, I need
only libintl.so, so just make install.
3) glib-2.28.1.tar.gz
1st, do patching with my attached file
(these are all that I found that have to be modified, mostly in the gio/
files, for there is nearly no arp/*.h in Android, is my patching safe and
right?)
2nd, write this into the cache file arm.cache:
*glib_cv_stack_grows=no**
glib_cv_uscore=no
ac_cv_func_posix_getpwuid_r=no
ac_cv_func_posix_getgrgid_r=no*
3rd, configured the same as libiconv:
configured by:
*CC=agcc CXX=agcc LD=arm-eabi-ld RANLIB=arm-eabi-ranlib \
PKG_CONFIG_LIBDIR=/data/local/lib/pkgconfig:/data/local/share/pkgconfig/ \
./configure \
--prefix=/data/local \
--host=arm-eabi-linux \**
--enable-malloc0returnsnull \*
* --enable-shared \*
4th, remove the -lpthread in gthread/Makefile.
5td, make;make install
But when using the libglib,libgio,libgobj..,I got plenty of SIGBUS and
SIGSEGFAULT. Have you met these? The glib mechanism is still too arcane for
me. Is my patching right?
PS, 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 my spicec-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.
In tracing the bug,the segfault/sigbus comes from libgobj and my patching
work is mainly in libgio.
And I have found no clue of successful use of libgio..etc. in Android.
So now, I think the problems are basically from two points:(suppose the
spice-gtk has no wrong-use of glib)
1. The compiling fault such as the incorrect alignment setting which is the
sin of the sigbus
2. The danger in the patching of the definitions from arpa/nameser*.h into
gio/gresolver.c..,etc. which may cause segfault.
Where can I get the libglib.so used by Gnash-android? Does it also use
libgio/libgthread..?
Is there anyone who have succeeded in using libgio,etc, in Android?
Anybody can give me some instructions of testing the sanity of libg*?
Appreciating!
--- glib-2.28.1/glib/gstrfuncs.c 2011-02-16 10:55:33.000000000 +0800
+++ aglib-2.28.1/glib/gstrfuncs.c 2011-03-21 16:33:18.000000000 +0800
@@ -442,8 +442,12 @@ g_ascii_strtod (const gchar *nptr,
fail_pos = NULL;
+#ifdef ANDROID
+ decimal_point = ".";
+#else
locale_data = localeconv ();
decimal_point = locale_data->decimal_point;
+#endif
decimal_point_len = strlen (decimal_point);
g_assert (decimal_point_len != 0);
@@ -656,8 +660,12 @@ g_ascii_formatd (gchar *buffer,
_g_snprintf (buffer, buf_len, format, d);
+#ifdef ANDROID
+ decimal_point = ".";
+#else
locale_data = localeconv ();
decimal_point = locale_data->decimal_point;
+#endif
decimal_point_len = strlen (decimal_point);
g_assert (decimal_point_len != 0);
--- glib-2.28.1/glib/gutils.c 2011-02-11 23:23:13.000000000 +0800
+++ aglib-2.28.1/glib/gutils.c 2011-03-21 17:08:09.000000000 +0800
@@ -29,6 +29,9 @@
*/
#include "config.h"
+#ifdef ANDROID
+#undef HAVE_PWD_H
+#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
--- glib-2.28.1/gio/libasyncns/asyncns.c 2010-04-13 21:33:16.000000000 +0800
+++ aglib-2.28.1/gio/libasyncns/asyncns.c 2011-03-21 17:11:43.000000000 +0800
@@ -18,6 +18,30 @@
<http://www.gnu.org/licenses/>.
***/
+#ifdef ANDROID
+typedef struct {
+ unsigned id :16; /*%< query identification number */
+ /* fields in third byte */
+ unsigned rd :1; /*%< recursion desired */
+ unsigned tc :1; /*%< truncated message */
+ unsigned aa :1; /*%< authoritive answer */
+ unsigned opcode :4; /*%< purpose of message */
+ unsigned qr :1; /*%< response flag */
+ /* fields in fourth byte */
+ unsigned rcode :4; /*%< response code */
+ unsigned cd: 1; /*%< checking disabled by resolver */
+ unsigned ad: 1; /*%< authentic data from named */
+ unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */
+ unsigned ra :1; /*%< recursion available */
+ /* remaining bytes */
+ unsigned qdcount :16; /*%< number of question entries */
+ unsigned ancount :16; /*%< number of answer entries */
+ unsigned nscount :16; /*%< number of authority entries */
+ unsigned arcount :16; /*%< number of resource entries */
+} HEADER;
+#endif
+
+
#ifdef HAVE_CONFIG_H
#include "g-asyncns.h"
#endif
@@ -57,6 +81,10 @@
#include <inttypes.h>
#endif
+#ifdef ANDROID
+#undef HAVE_SYS_PRCTL_H
+#endif
+
#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
#endif
--- glib-2.28.1/gio/gresolver.c 2011-02-11 23:23:11.000000000 +0800
+++ aglib-2.28.1/gio/gresolver.c 2011-03-21 16:42:18.000000000 +0800
@@ -20,6 +20,61 @@
* Boston, MA 02111-1307, USA.
*/
+#ifdef ANDROID
+/*%
+ * Inline versions of get/put short/long. Pointer is advanced.
+ */
+#define NS_INT32SZ 4 /*%< #/bytes of data in a u_int32_t */
+#define NS_INT16SZ 2 /*%< #/bytes of data in a u_int16_t */
+#define NS_GET16(s, cp) do { \
+ register const u_char *t_cp = (const u_char *)(cp); \
+ (s) = ((u_int16_t)t_cp[0] << 8) \
+ | ((u_int16_t)t_cp[1]) \
+ ; \
+ (cp) += NS_INT16SZ; \
+} while (0)
+#define NS_GET32(l, cp) do { \
+ register const u_char *t_cp = (const u_char *)(cp); \
+ (l) = ((u_int32_t)t_cp[0] << 24) \
+ | ((u_int32_t)t_cp[1] << 16) \
+ | ((u_int32_t)t_cp[2] << 8) \
+ | ((u_int32_t)t_cp[3]) \
+ ; \
+ (cp) += NS_INT32SZ; \
+} while (0)
+
+
+#define GETSHORT NS_GET16
+#define GETLONG NS_GET32
+
+#define ns_c_in 1 /*%< Internet. */
+#define ns_t_srv 33 /*%< Internet. */
+#define C_IN ns_c_in
+#define T_SRV ns_t_srv
+
+typedef struct {
+ unsigned id :16; /*%< query identification number */
+ /* fields in third byte */
+ unsigned rd :1; /*%< recursion desired */
+ unsigned tc :1; /*%< truncated message */
+ unsigned aa :1; /*%< authoritive answer */
+ unsigned opcode :4; /*%< purpose of message */
+ unsigned qr :1; /*%< response flag */
+ /* fields in fourth byte */
+ unsigned rcode :4; /*%< response code */
+ unsigned cd: 1; /*%< checking disabled by resolver */
+ unsigned ad: 1; /*%< authentic data from named */
+ unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */
+ unsigned ra :1; /*%< recursion available */
+ /* remaining bytes */
+ unsigned qdcount :16; /*%< number of question entries */
+ unsigned ancount :16; /*%< number of answer entries */
+ unsigned nscount :16; /*%< number of authority entries */
+ unsigned arcount :16; /*%< number of resource entries */
+} HEADER;
+#endif
+
+
#include "config.h"
#include <glib.h>
#include "glibintl.h"
--- glib-2.28.1/gio/gthreadedresolver.c 2011-02-11 23:23:12.000000000 +0800
+++ aglib-2.28.1/gio/gthreadedresolver.c 2011-03-21 16:44:29.000000000 +0800
@@ -20,6 +20,60 @@
* Boston, MA 02111-1307, USA.
*/
+#ifdef ANDROID
+/*%
+ * Inline versions of get/put short/long. Pointer is advanced.
+ */
+#define NS_INT32SZ 4 /*%< #/bytes of data in a u_int32_t */
+#define NS_INT16SZ 2 /*%< #/bytes of data in a u_int16_t */
+#define NS_GET16(s, cp) do { \
+ register const u_char *t_cp = (const u_char *)(cp); \
+ (s) = ((u_int16_t)t_cp[0] << 8) \
+ | ((u_int16_t)t_cp[1]) \
+ ; \
+ (cp) += NS_INT16SZ; \
+} while (0)
+#define NS_GET32(l, cp) do { \
+ register const u_char *t_cp = (const u_char *)(cp); \
+ (l) = ((u_int32_t)t_cp[0] << 24) \
+ | ((u_int32_t)t_cp[1] << 16) \
+ | ((u_int32_t)t_cp[2] << 8) \
+ | ((u_int32_t)t_cp[3]) \
+ ; \
+ (cp) += NS_INT32SZ; \
+} while (0)
+
+
+#define GETSHORT NS_GET16
+#define GETLONG NS_GET32
+
+#define ns_c_in 1 /*%< Internet. */
+#define ns_t_srv 33 /*%< Internet. */
+#define C_IN ns_c_in
+#define T_SRV ns_t_srv
+
+ typedef struct {
+ unsigned id :16; /*%< query identification number */
+ /* fields in third byte */
+ unsigned rd :1; /*%< recursion desired */
+ unsigned tc :1; /*%< truncated message */
+ unsigned aa :1; /*%< authoritive answer */
+ unsigned opcode :4; /*%< purpose of message */
+ unsigned qr :1; /*%< response flag */
+ /* fields in fourth byte */
+ unsigned rcode :4; /*%< response code */
+ unsigned cd: 1; /*%< checking disabled by resolver */
+ unsigned ad: 1; /*%< authentic data from named */
+ unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */
+ unsigned ra :1; /*%< recursion available */
+ /* remaining bytes */
+ unsigned qdcount :16; /*%< number of question entries */
+ unsigned ancount :16; /*%< number of answer entries */
+ unsigned nscount :16; /*%< number of authority entries */
+ unsigned arcount :16; /*%< number of resource entries */
+ } HEADER;
+#endif
+
#include "config.h"
#include <glib.h>
#include "glibintl.h"
--- glib-2.28.1/gio/gunixresolver.c 2011-02-11 23:23:12.000000000 +0800
+++ aglib-2.28.1/gio/gunixresolver.c 2011-03-21 16:45:01.000000000 +0800
@@ -20,6 +20,62 @@
* Boston, MA 02111-1307, USA.
*/
+#ifdef ANDROID
+/*%
+ * Inline versions of get/put short/long. Pointer is advanced.
+ */
+#define NS_INT32SZ 4 /*%< #/bytes of data in a u_int32_t */
+#define NS_INT16SZ 2 /*%< #/bytes of data in a u_int16_t */
+#define NS_GET16(s, cp) do { \
+ register const u_char *t_cp = (const u_char *)(cp); \
+ (s) = ((u_int16_t)t_cp[0] << 8) \
+ | ((u_int16_t)t_cp[1]) \
+ ; \
+ (cp) += NS_INT16SZ; \
+} while (0)
+#define NS_GET32(l, cp) do { \
+ register const u_char *t_cp = (const u_char *)(cp); \
+ (l) = ((u_int32_t)t_cp[0] << 24) \
+ | ((u_int32_t)t_cp[1] << 16) \
+ | ((u_int32_t)t_cp[2] << 8) \
+ | ((u_int32_t)t_cp[3]) \
+ ; \
+ (cp) += NS_INT32SZ; \
+} while (0)
+
+
+#define GETSHORT NS_GET16
+#define GETLONG NS_GET32
+
+#define ns_c_in 1 /*%< Internet. */
+#define ns_t_srv 33 /*%< Internet. */
+#define C_IN ns_c_in
+#define T_SRV ns_t_srv
+
+ typedef struct {
+ unsigned id :16; /*%< query identification number */
+ /* fields in third byte */
+ unsigned rd :1; /*%< recursion desired */
+ unsigned tc :1; /*%< truncated message */
+ unsigned aa :1; /*%< authoritive answer */
+ unsigned opcode :4; /*%< purpose of message */
+ unsigned qr :1; /*%< response flag */
+ /* fields in fourth byte */
+ unsigned rcode :4; /*%< response code */
+ unsigned cd: 1; /*%< checking disabled by resolver */
+ unsigned ad: 1; /*%< authentic data from named */
+ unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */
+ unsigned ra :1; /*%< recursion available */
+ /* remaining bytes */
+ unsigned qdcount :16; /*%< number of question entries */
+ unsigned ancount :16; /*%< number of answer entries */
+ unsigned nscount :16; /*%< number of authority entries */
+ unsigned arcount :16; /*%< number of resource entries */
+ } HEADER;
+#endif
+
+
+
#include "config.h"
#include <glib.h>
#include "glibintl.h"
--- glib-2.28.1/gio/glocalfileinfo.c 2011-02-11 23:23:11.000000000 +0800
+++ aglib-2.28.1/gio/glocalfileinfo.c 2011-03-21 16:55:10.000000000 +0800
@@ -1096,7 +1096,11 @@ lookup_uid_data (uid_t uid)
if (pwbufp->pw_name != NULL && pwbufp->pw_name[0] != 0)
data->user_name = convert_pwd_string_to_utf8 (pwbufp->pw_name);
+#ifdef ANDROID
+ gecos = NULL;
+#else
gecos = pwbufp->pw_gecos;
+#endif
if (gecos)
{
--- glib-2.28.1/gio/ginetaddress.c 2011-02-11 23:23:11.000000000 +0800
+++ aglib-2.28.1/gio/ginetaddress.c 2011-03-21 16:55:45.000000000 +0800
@@ -20,6 +20,27 @@
* Authors: Christian Kellner <[email protected]>
* Samuel Cormier-Iijima <[email protected]>
*/
+#ifdef ANDROID
+#define IN6_IS_ADDR_MC_NODELOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) \
+ && ((((__const uint8_t *) (a))[1] & 0xf) == 0x1))
+
+#define IN6_IS_ADDR_MC_LINKLOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) \
+ && ((((__const uint8_t *) (a))[1] & 0xf) == 0x2))
+
+#define IN6_IS_ADDR_MC_SITELOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) \
+ && ((((__const uint8_t *) (a))[1] & 0xf) == 0x5))
+
+#define IN6_IS_ADDR_MC_ORGLOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) \
+ && ((((__const uint8_t *) (a))[1] & 0xf) == 0x8))
+
+#define IN6_IS_ADDR_MC_GLOBAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) \
+ && ((((__const uint8_t *) (a))[1] & 0xf) == 0xe))
+#endif
#include <config.h>
_______________________________________________
Gnash-dev mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/gnash-dev