I am calling a Java application inside my C program, via JNI.
Having installed JDK 1.8, I have the following JNI .so libraries on my system:
/usr/java/jdk1.8.0_51/jre/lib/amd64/jli/libjli.so
/usr/java/jdk1.8.0_51/jre/lib/amd64/server/libjvm.so
To make these two files known to ldconfig, I can create links to them in /usr/lib64/, or create a /etc/ld.so.conf.d/java.conf file which lists them.
This allows me to compile my C code as follows:
gcc -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux/ \
-L/usr/java/jdk1.8.0_51/jre/lib/amd64/jli \
-L/usr/java/jdk1.8.0_51/jre/lib/amd64/server/ \
callSomeJava.c -ljvm -ljli
This feels like a system hack rather than a reliable way to develop and deploy JNI code. The JDK does not feel like it has exposed these libs to the OS in a way that encourages reliance upon them.
My questions are as follows:
- Why does the JDK contain a
linker name(lib.so) rather thanreal name(lib.so.N.N) of these libs? 3.1.1. Shared Library Names - Where should I get the required libs from, so they are already installed in a linkable manner without my system hacks?
- How can I compile/deploy my C, in a way which:
- is not dependent on me manually maintaining
ldconfigwhenever I update my JDK? - allows the resulting
a.outto find the libs in deployment environments which have not had myldconfighacks?
- is not dependent on me manually maintaining