[eside-ghost] Código C multiplataforma trabajando con JNI

Alejandro López Monge kodemonk en telefonica.net
Dom Jul 2 22:25:53 CEST 2006


Yo suelo programar en C++ para x86 y ppc, principalmente la mayor diferencia de
cara a portabilidad de código son los Endian issues. Mientras que PPC está en Big
endian x86 está en little. No tengo ni idea de lo que hace la función que has
mandado, pero lo que me ha llamado la atención son, este tipo de casts:

iid_args[4].s=(jshort) inq_info->clock_offset;

Java se precia de ser portable, por lo que no me extrañaría que almacenase los
datos de un modo independiente al de la arquitectura donde se compila,
suponiendo que esto fuese cierto y suponiendo también que el
formato estándar fuese Little endian este cast funcionaría en máquinas x86 pero no
en máqinas PPC. Para más información "man ntohs" y este PDF
www.emasterminds.net/endian-1.pdf


A ver si hay suerte y es eso ;D





On Sun, 2 Jul 2006 20:12:21 +0200
Arkaitz <arkaitzj en gmail.com> wrote:

> for (i=0; i<num_rsp; i++)
>         {
>                 baswap(&bdaddr_cpy, &inq_info->bdaddr);
>                 ba_str = batostr(&bdaddr_cpy); // Convert from bdaddr_t to char*
>                 jba_str = env->NewStringUTF(ba_str);
>                 iid_args[0].l = jba_str;
>                 iid_args[1].b = (jbyte)  inq_info->pscan_rep_mode;
>                 iid_args[2].b = (jbyte)  inq_info->pscan_period_mode;
>                 iid_args[3].b = (jbyte)  inq_info->pscan_mode;
>                 /*              iid_args[4].s = (jshort)
> inq_info->dev_class[0];
>                                 iid_args[5].s = (jshort)
> inq_info->dev_class[1];
>                                 iid_args[6].s = (jshort)
> inq_info->dev_class[2];*/
>                 iid_args[4].s = (jshort)    inq_info->clock_offset;
>                 //              iid_args[5].i =
> (jint)((inq_info->dev_class[0] & 0xfc) | ((inq_info->dev_class[1] &
> 0x1f) << 8) | ((inq_info->dev_class[2] & 0x3ff) << 13));
>                 iid_args[5].i = (jint)((inq_info->dev_class[0] & 0xff)
> | ((inq_info->dev_class[1] & 0xff) << 8) | ((inq_info->dev_class[2] &
> 0xff) << 16));
>                 printf("Apunto de crear un nuevo objeto\n");
> 
> ///AQUI ES DONDE PETA VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
>                 info_dev = env->NewObjectA(iid_cls, iid_con_id, iid_args);
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 
>                 env->CallVoidMethod(agent, ii_add_id, info_dev);
> 
>                 inq_info++;
>         }
>         printf("Objetos creados!!!!\n");
>         free(inq_info_bak);
>         return true;

-- 
   Alejandro López Monge
   Universidad de Deusto
   Aptdo. 1
   48080 - Bilbao (SPAIN)
   Ext: 2933
   e-mail: kodemonk en emasterminds.net


Más información sobre la lista de distribución eside-ghost