I'm trying to use a compiled .jar Java library in my PyDev Jython project.
I successfully added the .jar to the PYTHONPATH and was able to begin coding with auto complete working.
The library requires a .dll extension as well, javaHeclib.dll
, so I added that to the External Libs section of my project.
I can import the library fine, but I get an error when I try to access any of its functions:
java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: no javaHeclib in java.library.path
I added a VM argument to my Run Configuration, with no luck:
-Djava.library.path="Y:/path/to/javaHeclib.dll;${env_var:PATH}"
I can run the library from the command line just fine using the java.library.path
above.
Experimenting in the PyDev Console, I noticed I can load the .dll extension with an absolute path, but not a relative one:
>>> import java.lang >>> java.lang.System.load('Y:/path/to/javaHeclib.dll') >>> java.lang.System.loadLibrary('javaHeclib') Traceback (most recent call last): File "<console>", line 1, in ? java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: no javaHeclib in java.library.path
Unfortunately, the library is using the the System.loadLibrary
call above, and I don't have access to its source.
Why is javaHeclib.dll
not in my java.library.path
?
EDIT
Setting the java.library.path
to the directory containing the dll didn't allow me to load it using System.loadLibrary
.
-Djava.library.path="Y:/path/to/dll/;${env_var:PATH}"
(Using forward slashes didn't make a difference.) I also tried changing the default VM args in eclipse.ini
, with no luck:
-vmargs -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx384m -Djava.library.path="Y:\path\to\dll\;${env_var:PATH}"
java. library. path is a System property, which is used by Java programming language, mostly JVM, to search native libraries, required by a project. Similar to PATH and Classpath environment variable, java.
Native libraries are platform-specific library files, including . dll, . so, or *SRVPGM objects, that can be configured within shared libraries. Native libraries are visible to an application class loader whenever the shared library is associated with an application.
I think the better way is:
That's it. You do not need to manually change anything in configuration.
I got this working.
For future reference:
Say the dll you need is in Y:\path\to\dlls\lib\
. Then set your Run Configuration's working directory to Y:\path\to\dlls\
and set your VM arguments to include -Djava.library.path=lib
.
That's it, it should now work. I don't know why specifying an absolute path in java.library.path
didn't work previously, but setting a working directory seems to have done it.
Perhaps it's something peculiar to the specific library I'm using (or that Eclipse is running from a different drive than the library is on)...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With