J’ai stocké des pointeurs c dans Java via JNI en suivant les conseils de @tulskiy dans ce post. Passing pointers entre C et Java via JNI
L’astuce consiste à lancer le pointeur comme un jlong. Donc de c j’ai return (jlong) ptr;
Je retourne un jlong (toujours 64 bits) parce que je veux que mon code fonctionne sur les systèmes 64 et 32 bits. La taille en mémoire d’un pointeur 64 bits sur un ordinateur 64 bits est de 64; 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, je reçois un avertissement du compilateur disant “transtyper en entier à partir 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.
J’aimerais que mon code soit compilé sans avertissements afin que, s’il y a un avertissement légitime, je le voie. Quelqu’un a des idées?
Merci ben
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?
intptr_t
à jlong
et retour fonctionne, à condition que jlong
soit suffisamment grand (ce que vous supposez implicitement de toute façon). uinttptr_t
de uinttptr_t
en jlong
et retour évite une extension de signe, mais constitue un comportement indéfini si uintptr_t
est trop gros pour tenir dans un jlong
(mais toutes les architectures / compilateurs “sains” utilisent uniquement l’arithmétique du complément à deux) Essayez de transtyper avec intptr_t (enregistrez un pointeur quelle que soit la capacité de la plate-forme).