aboutsummaryrefslogtreecommitdiff
path: root/jniwrap/README.md
blob: e5748cdaf1c2122c79ab04121abf14e91ca9aa48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# PROJ bridge to Java

This is the third release of JNI wrappers for the main PROJ functions.
The first release of JNI wrappers were created by http://www.hydrologis.com.
The second release of JNI wrappers were created by http://www.geoapi.org.



## What is "PROJ bridge to Java"

_Proj bridge to Java_ is a small library of Java classes that wrap a few PROJ functions
by using the Java Native Interface (JNI). The main Java class is `org.proj4.PJ`.



### Compilation

To compile the native part, `configure` has to be run in the PROJ directory like this:

    CFLAGS=-Iinclude2 ./configure --with-jni=include1

where

* `include1` = folder in which the header file `jni.h` resides (usually `$JAVA_HOME/include`)
* `include2` = folder in which the header file `jni_md.h` resides (usually `$JAVA_HOME/include/linux` or whatever)

On MacOS, those two folders are `/Library/Java/JavaVirtualMachines/.../Contents/Home/include/`.


The java part is compiled by running Ant inside the `jniwrap` folder.
This will compile the classes and archive them in a JAR file.
It applies to Linux, MacOS and Windows (and virtually to every system supporting java).



### Requirements

Beyond the ones already put by PROJ, you need:

* For compilation:
  * Java 9+, the Java standard development kit version 9 or above
  * Ant 1.9.8+, to run the build.
* For execution:
  * If a Java version less than the current version on the local machine is desired,
    add a `release` attribute in the `javac` task of `build.xml` before to compile.



### Documentation

The documentation is held inside the code and can be retrieved by running
`ant javadoc` inside the folder `jniwrap`. This will create the HTML format
documentation inside of `jniwrap/out/apidocs`



### License

GPL for the first release.
Proj.4 license for the second release.



### Authors

* Andrea Antonello (andrea.antonello@hydrologis.com)
* Martin Desruisseaux (martin.desruisseaux@geomatys.com)



## Usage & a fast example:

The `proj.jar` is all is needed to implement PROJ support in java applications.
The whole job is done by the PROJ library, so there are just a couple of functions that be used.

The best way is to see everything through an example.
In the following example we create two Coordinate Reference System and transform 3 points.
The Coordinate Reference Systems and the points are hard-coded for simplicity.
Of course, real applications would read them from a file or other data source.

    import org.proj4.*;
    import java.util.Arrays;

    /**
     * Converts coordinates from EPSG:32632 (WGS 84 / UTM zone 32N) to WGS84,
     * then prints the result to the standard output stream.
     */
    public class Main {
        public static void main(String[] args) throws PJException {
            PJ sourcePJ = new PJ("+init=epsg:32632");           // (x,y) axis order
            PJ targetPJ = new PJ("+proj=latlong +datum=WGS84"); // (λ,φ) axis order
            double[] coordinates = {
                500000,       0,   // First coordinate
                400000,  100000,   // Second coordinate
                600000, -100000    // Third coordinate
            };
            sourcePJ.transform(targetPJ, 2, coordinates, 0, 3);
            System.out.println(Arrays.toString(coordinates));
        }
    }



### Compile the Main code

We assume that PROJ was compiled with the right flag to support the bridge to Java.
Therefore we have a library called `proj.jar`.
Thus we compile the `Main.java` with the command:

    javac --class-path <path to the jar library>/proj.jar Main.java

and execute the created test case with:

    java --class-path .:<path to the jar library>/proj.jar -Djava.library.path=<path to the libproj, if needed> Main



### Troubleshooting

If an `java.lang.UnsatisfiedLinkError` is thrown at execution time, add the following line in the Java code:

    System.out.println(System.getProperty("java.library.path"));

Then verify that the `libproj.so` (Linux), `libproj.dylib` (MacOS) or `libproj.dll` (Windows) file is located
in one of the directories listed by above code. If this is not the case, then try configuring the
`LD_LIBRARY_PATH` (Linux), `DYLD_LIBRARY_PATH` (MacOS) or `PATH` (Windows) environment variable.
If the problem persist, adding the `-verbose:jni` option to the `java` command may help more advanced diagnostics.