What JInput does under the covers is whatever the OS tells it, this means that it's up to the device drivers to identify the axis that the controller has. This means that different devices and sometimes the same device but on a different OS will list different axis. It's not ideal, but JInput was only designed to expose the hardware in a consistent way, not to make the devices or drivers underneath consistent
. As for the initial value issue, this is again down to the OS, JInput reads the initial values of the axis and then waits for the OS to notify it of changes in value, again, we could ignore the initial read and just use the updates, but that's not what the OS tells us, so we leave that up to the user of JInput.
There might be an argument for a layer above JInput that handles things like axis mappings and the initial value issue, if anyone fancies doing that, feel free