I think I understand what you mean.
If MemoryBuffers are implemented, then it will disappear from your code. You instantiate a memory buffer, the constructor gets the address and stores it, and when you pass the MemoryBuffer to a method it either calls the “pointer” version of the method with the address of the buffer wrapped in the MemoryBuffer, or it passes the whole lot to JNI which then extracts the address and uses it. It’s a bit more overhead for the library, but it removes that from the developer.
Currently you can’t do without getDirectBufferAddress, as you need to do the caching. Passing a ByteBuffer to a method and making it get the buffer’s address each time is too costly. However, until MemoryBuffer appears (if it ever does) for now you can just implement your own wrapper for ByteBuffer, as I’m sure many of us have done so. Used like:
gl.getIntegerv(GL.WHATEVER, myBuf.getAddress()) ;
Call getDirectBufferAddress in the constructor, cache it as an instance variable and implement a getAddress method to pull it out. The address is then held with the data, you’re less likely to get things mixed up, and the “ugly” method call disappears from all your code except the wrapper. Tada! ;D