2011-07-01 12 views
9

he estado almacenando punteros c en Java a través de JNI, siguiendo el consejo de @tulskiy en este post Passing pointers between C and Java through JNIpasar punteros entre C y Java a través de JNI

El truco consiste en emitir el puntero como un jlong. Así que desde c Tengo return (jlong) ptr;

Estoy devolviendo un jlong ​​(siempre 64 bits) porque quiero que mi código funcione en sistemas de 64 y 32 bits. El tamaño en la memoria de un puntero de 64 bits en una computadora de 64 bits es 64 y se deduce que en una computadora de 32 bits, el tamaño del puntero en la memoria es de 32 bits.

El problema es que en la máquina de 32 bits aparece una advertencia del compilador que dice "fundición a entero desde un puntero de diferente tamaño". Las advertencias desaparecen si tengo return (jlong) (int32_t) ptr; Sin embargo, este código no es bueno para la máquina de 64 bits.

Me gustaría tener mi código compilar sin advertencias para que si hay una advertencia legítima lo veré. ¿Alguien tiene alguna idea?

Gracias, Ben

Respuesta

11

Hay varios tipos enteros prácticos en C. El que desea es probablemente intptr_t o uintptr_t:

return (jlong)(intptr_t) ptr; 

La diferencia?

  • Colada de intptr_t a jlong y la espalda se garantiza que funcione proporcionado jlong es lo suficientemente grande (que está suponiendo implícitamente que es de todos modos).
  • Colada de uinttptr_t a jlong y la espalda evita una extensión de signo, pero es un comportamiento indefinido si el uintptr_t es demasiado grande para caber en un jlong (pero todas las arquitecturas/compiladores "sano" sólo tiene que utilizar la aritmética de complemento a dos)
1

Prueba a transmitir con intptr_t (almacenar un puntero independientemente de la capacidad de la plataforma).

Cuestiones relacionadas