Archived Forum PostQuestion:
I’m the developer in charge for the integration in one of our web projects and i’m facing problems when loading the DLL: i’m getting a “java.lang.UnsatisfiedLinkError has been caught, com.chilkatsoft.chilkatJNI.new_CkUnixCompress()” exception.
Please note that i can succesfully use the CkUnixCompress in a normal java class when i run a main method from the command line, the problem seems to be when i try to use the class from inside the PlayFramework. I can’t find a way to make the framework load/find the DLL.
I tried to pass a –Djava.library.path directive, i tried to directly load the dll from inside the application, and so on, but no success…
Did you have any previous experience with the PlayFramework (v1.3.0) before?
I can provide you an example project to reproduce the issue if you want.
Here are some tech details:
Working on a Windows 8.1 64bit machine
Java 1.8 (compiling with 1.6 compliance)
PlayFramework version 1.3.0 (link)
Eclipse Luna (v4.4.0)
Chilkat 9.5.0.48 (DllDate Mar 6 2015)
We finally found a solution that works for us:
as mentioned before, we use an external jar that statically load the dll files listed in a property file.
The jar contains just one class named JniBootstrap with a static block like this:
static
{
Properties prop = getProps(); // read a property file with getResourceAsStream
for (int i = 0; i < 1000; i++)
{
String dll = prop.getProperty("jni." + i);
if (dll != null && !(dll.trim().length() == 0))
load(dll); // load the dll with System.load(dll)
}
}
In our webapp we just do
Class.forName(“mypackage.JniBootstrap”);
The problem was that when run as a windows service, the webapp uses a different ClassLoader, making it impossible to find the property file.
So the fix was change the getProps() method and make it try different classloaders, something like this:
InputStream in;
in = ClassLoader.getSystemClassLoader().getResourceAsStream(CONFIG_FILENAME); // works when developing in Eclipse
if (in == null)
{
in = JniBootstrap.class.getResourceAsStream(CONFIG_FILENAME);
}
if (in == null)
{
in = Thread.currentThread().getContextClassLoader().getResourceAsStream(CONFIG_FILENAME); // works when webapp is deployed as a windows service
}
I doubt there are others using this combination of old PlayFramework + Chilkat lib + windows service, anyway this works in our environment and maybe could be useful in the future.