2011-07-01 6 views
9

J'ai stockage des pointeurs de c dans Java via JNI en suivant les conseils de @tulskiy dans ce post Passing pointers between C and Java through JNIpassage des pointeurs entre C et Java via JNI

L'astuce est de jeter le pointeur comme jlong. Donc de c j'ai return (jlong) ptr;

Je retourne un jlong ​​(toujours 64 bits) parce que je veux que mon code fonctionne à la fois sur les systèmes 64 et 32 ​​bits. La taille en mémoire d'un pointeur 64 bits sur un ordinateur 64 bits est 64 et il s'ensuit que sur un ordinateur 32 bits, la taille du pointeur en mémoire est de 32 bits. Le problème est que sur la machine 32 bits, j'obtiens un message d'avertissement du compilateur disant "conversion en entier d'un pointeur de taille différente." Les avertissements disparaissent si j'ai return (jlong) (int32_t) ptr; Cependant, ce code n'est pas bon pour la machine 64 bits.

Je voudrais que mon code compile sans avertissements de sorte que s'il y a un avertissement légitime, je le verrai. Quelqu'un a des idées?

Merci, Ben

Répondre

11

Il existe différents types entiers pratiques en C. Celui que vous voulez est probablement intptr_t ou uintptr_t:

return (jlong)(intptr_t) ptr; 

La différence?

  • casting intptr_t-jlong et retour est garanti au travail fourni jlong est assez grand (que vous assumez implicitement il est de toute façon).
  • casting uinttptr_t-jlong et le dos évite une extension de signe, mais est un comportement non défini si le uintptr_t est trop grand pour tenir dans une jlong (mais toutes les architectures/compilateurs « sain d'esprit » utilisent simplement arithmétique de complément à deux)
1

Essayez coulée avec intptr_t (stocker un pointeur quelle que soit la capacité de la plate-forme).

Questions connexes