On a recent question, I got comments asking whether I was using “native code” in my application. Now, I know that there is some way to call code in traditional binary libraries (DLLs, SOs) from inside a Java application using a thing called “JNI”. I have read that Wikipedia entry but I never used this.
I am using a number of libraries, some of which may or may not use native code. How do I find out if they do? I did not have to install any SOs (running on Linux), but I guess that doesn’t mean the libraries are not using any? Do I have to browse through all the documentation (which varies greatly in quality between libraries) or can I do some analysis on the JARs?
Usually using libraries that require JNI requires some additional setup (like putting
.dllor.sofiles in the right places or setting thejava.library.pathSystem property).If you did nothing of that, then chances are that you’re not using JNI anywhere. This is also somewhat likely, as only quite specialized libraries require JNI.
However there’s also JNA, which is a wrapper around JNI which simplifies its usage and which sometimes makes it unnecessary to do any explicit setup. If that’s used by one of your libraries, then it’s harder to detect.
If you get a crash dump, then checking that for any non-standard libraries can give a hint if a user-loaded native library is to blame.