Building GDAL/OGR Java Bindings on Linux/Unix?/MinGW

Tested with GDAL 1.5.2, 1.7.0 and 1.9.2.

Configure and Build GDAL

You need swig in the path.

I found I had to configure GDAL --without-libtool to get the java bindings to build.

Note : with GDAL 1.7.0, this restriction is no longer necessary. libtool building should work just fine.

Update java.opt

Replace/Create? gdal/swig/java/java.opt with an appropriate local version. Make sure the windows backslashes are turned to forward slashes, and point to your local Java SDK. ant is assumed to be in the path.

JAVA_HOME = /home/warmerda/pkg/jdk1.6.0_10
JAVADOC=$(JAVA_HOME)/bin/javadoc
JAVAC=$(JAVA_HOME)/bin/javac
JAVA=$(JAVA_HOME)/bin/java
JAR=$(JAVA_HOME)/bin/jar
JAVA_INCLUDE=-I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux

OS X Leopard

See this ticket http://trac.osgeo.org/gdal/ticket/2401 for a patch and java.opt for building the java bindings on Leopard

Win32 MinGW

Tested with GDAL 1.7.0. Building the Java bindings under MinGW is possible but requires a bit of patching :

* Update the JAVA_HOME variable in gdal/swig/java/java.opt and change the JAVA_INCLUDE variable to the following value :

JAVA_INCLUDE=-I$(JAVA_HOME)/include -I.

* in swig/java/GNUmakefile, we ensure that the name of the DLLs are not prefixed by lib, by changing the 'JAVA_MODULES= libgdaljni.$(SO_EXT)...' and '$(JAVA_MODULES): %jni.$(SO_EXT)...' lines to be

JAVA_MODULES = gdaljni.$(SO_EXT) ogrjni.$(SO_EXT) gdalconstjni.$(SO_EXT) osrjni.$(SO_EXT)

and

$(JAVA_MODULES): %jni.$(SO_EXT): %_wrap.$(OBJ_EXT)

* Create a jni_md.h file in gdal/swig/java directory with the following content that ensures thanks to the empty JNICALL that the symbols in the *jni.dll have the proper decorations

#ifndef _GDAL_JNI_MD_H_
#define _GDAL_JNI_MD_H_

#define JNIEXPORT __declspec(dllexport)
#define JNIIMPORT __declspec(dllimport)
#define JNICALL

typedef long jint;
typedef __int64 jlong;
typedef signed char jbyte;

#endif

Then run make from gdal/swig/java. and the GDAL DLL is in the path, "java -cp "gdal.jar;build/apps" gdalinfo" should work.

Run the java build

Do a "make" in gdal/swig/java.

You should see a bunch of stuff, possible ending with this:

cp ./.libs/*.so ./
cp: cannot stat `./.libs/*.so': No such file or directory
make: [build] Error 1 (ignored)
ant
Buildfile: build.xml

compile:
    [javac] Compiling 33 source files to /wrk/home/warmerda/wrk/gdal-1.5.2/swig/java/build/classes
     [echo] compilation complete

archive:
      [jar] Building jar: /wrk/home/warmerda/wrk/gdal-1.5.2/swig/java/gdal.jar

BUILD SUCCESSFUL
Total time: 2 seconds

Don't worry about the ./.libs/*.so error. That appears to be something that would apply with libtool builds.

Running something

While still in gdal/swig/java try:

javac apps/gdalinfo.java
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:`pwd`:path_to_directory_where_libgdal_so
java -classpath `pwd`/gdal.jar:`pwd`:`pwd`/apps gdalinfo

Starting with GDAL 1.7.0, the utilities are automatically built in the swig/java/build/apps directory. So after building, you can just do

setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:`pwd`:path_to_directory_where_libgdal_so
java -classpath `pwd`/gdal.jar:`pwd`:`pwd`/build/apps gdalinfo

With luck you will see the gdalinfo usage message.

To deploy you need gdal.jar in your class path, the 4 .so files (libgdalconstjni.so, libgdaljni.so, libogrjni.so and libosrjni.so) and libgdal.so in your shared library path.