IntBuffer ib = ByteBuffer.wrap(bytes).order(endian).asIntBuffer();
Not sure Internally how it works but looks mostly like the C/C++ pointer concept, that's great.
Use one of the function calls to "map" Bytes to Ints, and then see if changes to one are reflected by changes in the other, ie are they using the same memory locations?
If not, then the Java function is allocating and copying memory, and no degree of wrapper thinness is going to magic that away.
Although, speaking of magic, I do recall that MMUs can make one area of memory look like two (subject to page address alignment) and defer the allocation and copying until changes (writes) are made to one of the "duplicated" memory pages.
edit: I also vaguely recall being able to memory-map files as arrays under VAX VMS, and I believe what it did was map the file pages as paged-out memory pages, and then later the file would read from disk by the usual virtual memory handler when the array was accessed, no extra effort required.