There are no beautifull options, so here go the ugly ones:
If you are using Sun (now Oracle) JRE 5.0 or 6.0, you can use the following:
ByteBuffer buffer = ByteBuffer.allocateDirect(pageSize);
Method getAddress = buffer.getClass().getMethod("address");
long address = getAddress.invoke(buffer);
// and now send address to JNI
To access data in Java, use buffer. To access in JNI, cast address to a pointer. Both will see/change the same data.
The address is supposed to be page-aligned, but to be sure of that, you can allocate two pages (surely there will be enough space for a full aligned page). Then you align the address on the page and apply an offset to ByteBuffer access.
Another option for buffer allocation and native calls, that works on any VM, is using JNAs Memory class: http://jna.java.net/javadoc/com/sun/jna/Memory.html. Don't be scared with com.sun package. It's open-source and LGPL.