11

I've been storing c pointers in Java through JNI by following the advice of @tulskiy in this post Passing pointers between C and Java through JNI

The trick is to cast the pointer as a jlong. So from c I have return (jlong) ptr;

I'm returning a jlong (always 64 bits) because I want my code to work on both 64 and 32 bit systems. The size in memory of a 64 bit pointer on a 64 bit computer is 64 and it follows that on a 32-bit computer, the size of the pointer in memory is 32 bits.

The problem is that on the 32 bit machine I get a compiler warning saying "casting to integer from pointer of different size." The warnings goes away if I have return (jlong) (int32_t) ptr; However this code is not good for the 64 bit machine.

I would like to have my code compile without warnings so that if there is a legitimate warning I will see it. Anyone have any ideas?

Thanks, Ben

Community
  • 1
  • 1
Ben
  • 2,430
  • 3
  • 22
  • 24

2 Answers2

14

There are various handy integer types in C. The one you want is probably intptr_t or uintptr_t:

return (jlong)(intptr_t) ptr;

The difference?

  • Casting from intptr_t to jlong and back is guaranteed to work provided jlong is big enough (which you're implicitly assuming it is anyway).
  • Casting from uinttptr_t to jlong and back avoids a sign-extension, but is undefined behaviour if the uintptr_t is too big to fit in a jlong (but all "sane" architectures/compilers just use two's complement arithmetic)
tc.
  • 33,468
  • 5
  • 78
  • 96
1

Try casting with intptr_t (store a pointer regardless of the platform capacity).

Tatvamasi
  • 2,537
  • 19
  • 14