I've needed to convert back and forwards between WGS84 (the GPS projection) and EPSG 27700 (UK National Grid) and I've found the geotrellis library most accurate and usable. It's written in Scala but obviously you can use the library in Java. Here's the maven dependency I've used:
<dependency>
<groupId>org.locationtech.geotrellis</groupId>
<artifactId>geotrellis-proj4_2.12</artifactId>
<version>2.3.1</version>
</dependency>
and this is some example code:
CRS epsg27700 = CRS.fromEpsgCode(27700);
CRS wgs84 = CRS.fromEpsgCode(4326);
var toWgs84 = Transform.apply(epsg27700, wgs84);
var fromWgs84 = Transform.apply(wgs84, epsg27700);
Tuple2<Object, Object> southWestInWgs84 = toWgs84.apply(-90_619.29, 10_097.13);
System.out.println("South-West corner in WGS 84: " + southWestInWgs84._1() + "," + southWestInWgs84._2());
Tuple2<Object, Object> southWestBackToEpsg27700 = fromWgs84.apply(southWestInWgs84._1(), southWestInWgs84._2());
System.out.println("South-West corner back to EPSG 27700: " + southWestBackToEpsg27700._1() + "," + southWestBackToEpsg27700._2());
which produces this output:
South-West corner in WGS 84: -8.820000046234389,49.7899999643445
South-West corner back to EPSG 27700:
-90619.2888566542,10097.128186725415