Передача указателей между C и Java через JNI - PullRequest
10 голосов
/ 01 июля 2011

Я хранил указатели c в Java через JNI, следуя советам @tulskiy в этом посте Передача указателей между C и Java через JNI

Хитрость в том, чтобы навести указатель на джлонга. Итак, с я имею return (jlong) ptr;

Я возвращаю jlong ​​(всегда 64 бит), потому что я хочу, чтобы мой код работал как на 64, так и на 32 битных системах. Размер в памяти 64-разрядного указателя на 64-разрядном компьютере равен 64, и из этого следует, что на 32-разрядном компьютере размер указателя в памяти составляет 32 бита.

Проблема в том, что на 32-битной машине я получаю предупреждение компилятора, говорящее «приведение к целому числу из указателя другого размера». Предупреждения исчезают, если у меня есть return (jlong) (int32_t) ptr; Однако этот код не подходит для 64-битной машины.

Я хотел бы, чтобы мой код компилировался без предупреждений, чтобы при наличии допустимого предупреждения я его видел. У кого-нибудь есть идеи?

Спасибо, Ben

Ответы [ 2 ]

13 голосов
/ 01 июля 2011

Существуют различные удобные целочисленные типы в C. Вероятно, вам понадобится intptr_t или uintptr_t:

return (jlong)(intptr_t) ptr;

Разница?

  • Приведение от intptr_t к jlong и обратно гарантированно будет работать при условии, что jlong достаточно велик (что вы в любом случае подразумеваете, что это так или иначе).
  • Приведение от uinttptr_t к jlong и обратно избегает расширения знака, но является неопределенным поведением, если uintptr_t слишком велик, чтобы поместиться в jlong (но все "нормальные" архитектуры / компиляторы просто используют двойная арифметика)
1 голос
/ 01 июля 2011

Попробуйте выполнить приведение с помощью intptr_t (сохранить указатель независимо от емкости платформы).

...