Passing pointers between C and Java through JNI
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 p开发者_Go百科ointer 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
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
tojlong
and back is guaranteed to work providedjlong
is big enough (which you're implicitly assuming it is anyway). - Casting from
uinttptr_t
tojlong
and back avoids a sign-extension, but is undefined behaviour if theuintptr_t
is too big to fit in ajlong
(but all "sane" architectures/compilers just use two's complement arithmetic)
Try casting with intptr_t (store a pointer regardless of the platform capacity).
精彩评论