The problem
I've been trying to run a unit test on my own Mac. The test runs fine on Linux servers, but fails locally with the following trace:
java.lang.UnsatisfiedLinkError: no fedel_client in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1758)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1045)
....
What I've tried
Copy the .so file from the server
I've copied fedel_client.so from the server to /workspace/dapper/java/lib/native/macosx on my local machine, and added it to the java.library.path:
-Djava.library.path=/workspace/dapper/java/lib/native/macosx:...
Create a symlink
I've created a symlink from fedel_clinet to fedel_clinet.so, in case that Java is looking for the former (without the .so extension).
Add the .so directory to .bashrc
I've tried adding .so directory to PATH:
PATH=$PATH:/Users/adamatan/workspaces/trunk/dapper/java/lib/native/macosx
And to LD_LIBRARY_PATH:
export LD_LIBRARY_PATH="/Users/adamatan/workspaces/trunk/dapper/java/lib/native/macosx"
Print the java.library.path
I've printed java.library.path, to see if the changes in the Eclipse environment were propagated to the JVM:
System.out.println(System.getProperty("java.library.path"));
And got:
/workspace/dapper/java/lib/native/macosx:....
The exact values I placed in the Eclipse configuration.
Debugging ideas?
I got the exact same error with all the aforementioned solutions. Any idea how to debug this problem? Can I get a more verbose error message from Java? Is the file not found, or not loaded? If it isn't loaded, why is that?
I may be reading you wrong, but it sounds like you've copied the native library (libfedel_client.so) from the Linux server to your own Mac. If this is the case, this will certainly not work. You cannot use a Linux native library on your Mac, you will need to recompile it on the Mac to produce a libfedel_client.dylib.
Depending on the version of the Apple Java runtime you're using, you may need to use the .jnilib extension. Early runtimes used the .jnilib extension instead of .dylib, and both extensions are still supported (although .dylib is now the default.)
Related
OS is Linux Ubuntu 16.04 LTS
(The application runs absolutely fine on Windows, I did not have to configure anything after the installation of Matlab Compiler SDK)
I am writing a web application in Java which also calls some functions written in Matlab which requires install Matlab Compiler SDK, after the installation, it told me to append this /usr/local/MATLAB/MATLAB_Runtime/v901/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v901/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v901/sys/os/glnxa64: to the end of the LD_LIBRARY_PATH variable, which I did by
export LD_LIBRARY_PATH=/usr/local/MATLAB/MATLAB_Runtime/v901/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v901/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v901/sys/os/glnxa64:
But why do I keep getting this error when I try to run the web app in Netbeans?
java.lang.UnsatisfiedLinkError: Failed to find the required library libmwmclmcrrt.so.9.0.1 on java.library.path.
This library is typically installed along with MATLAB or the MCR. Its absence may indicate an issue with that installation or the current path configuration.
libmwmclmcrrt.so.9.0.1 resides inside the /usr/local/MATLAB/MATLAB_Runtime/v901/runtime/glnxa64 directory
I also added -Djava.library.path to point to 3 directory entries above to see if it helps, but it does not do anything good at all.
I read several posts on here, but did not seem to solve it.
JNI: Library is Found on Path, but Method is not (java.lang.UnsatisfiedLinkError)
java.lang.UnsatisfiedLinkError even on setting -Djava.library.path
How do I fix this? BTW, this is a web application
[ Tested on Mac OS High Sierra version 10.13.5 (17F77), should be similar for Linux ]
What I did was when I started the application server (In my case Payara). I provided the path to the javabuilder.jar like so
For Payara Full
asadmin deploy --libraries /path/to/javabuilder.jar app.war
For Payara Micro
java -jar payara-micro.jar --deploy app.war --addlibs /path/to/javabuilder.jar
Note:
/path/to/javabuilder.jar is the location of javabuilder.jar within the directory MATLAB_HOME/MATLAB_Runtime/SOME_VERSION/toolbox/javabuilder/jar/javabuilder.jar, Copying this javabuilder.jar file out and reference it will fail with the same error. It must be its original path for it to work. Not sure why
I am trying to use the 64 bit rxtx serial communication library (downloaded from cloudhopper) with 64bit windows 7 and eclipse. I get the message:
java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path. The dlls are in the /jre/lib dir as well as the Windows/System32. The RXTXcomm.jar is in the build path for eclipse as well as in the jre/lib/ext dir. I ran process monitor in the background and and see that RXTXcomm.jar, rxtxSerial.dll, and rxtxParallel.dll are all found and have been opened, So I am unclear as to why this problem is occurring.
Any suggestions.
Go to Project -> properties -> Java build path ->Find your .jar.
Click on + to open the JAR's properties.
Select Native library location and edit it to point to RXTX's shared library (.DLL, .so, .dylib).
You can install librxtx-java package from repo for Ubuntu.
You can also add a virtual machine argument:
-Djava.library.path=c:\path\to\dll\
or
-Djava.library.path=/path/to/lib/
That worked for me. Also refer to this question.
Windows user : my problem was actually that I was placing the rxtxSerial.dll and the rxtxParallel.dll files in the wrong directory.
In my case, they were in [...]/jdk1.7.0_09/bin/ instead of [...]/jre7/bin/, although paths may differ for different versions of Java.
After all it's logic, if we want our JAR to run outside our IDE, we must have the dlls in our java running environment, not in our development environment :)
I resolve this problem by adding rxtxSerial.dll[jre 1.8.0_45/bin] and RxTxcomm.jar[jre 1.8.0_45/lib/ext]
Hy, I had the same problem when integrating the RXTXcomm into Netbeans under Ubuntu 11.10.
I am guessing that you are not copying the files in the right place, at least that was my problem.
Under Ubuntu java is installed under usr/lib/jvm. BUT here I had a lot of forders (ex java-7-openjdk-i386, java-7-common, java-6-openjdk ...). In Netbeans I check what is the path of the JDK included into the project, it was java-7-openjdk-i386 . so I took the rxtxSerial.so (under windows it is rxtxSerial.dll) and copied it to java-7-openjdk-i386/jre/bin and it worked like a charm .
I hope this helps.
I was having the same problem even after installing the RXTXcomm.jar in the Java\jdk\lib directory. Based on the instructions at http://www.jcontrol.org/download/readme_rxtx_en.html
I located the rxtxSerial.dll and the rxtxParallel.dll files. Placing them in the bin directory did not help, but placing them in the lib directory along with the RXTXcomm.jar solved the problem.
I had the same problem. So I installed JDK 32-bit and added those RxTx files(x86) to Program files(x86)/java/... folder instead of Program files/java... folder. Also I added those RxTx .dll files(x86) to /System32 folder. After that the problem was resolved in my application.
FIXED:
when using IDE such Netbeans it has it's own directory for the JRE, were you probably installed your RXTX drivers, but when running the JAR file outside your IDE this error occurs...
Solution is install the RXTX drivers also inside the JAVA JRE directory which use to run all your JAR files.
Under Netbeans 5.5 on Windows, I needed to right-click Libraries under
Projects on the left hand side of the screen, and select "Add
JAR/Folder", picking the RXTXcomm.jar file. Only then did my
enter code here
become a valid command.
Also, I got a run-time error where it failed to load the
rxtxSerial.DLL library because it couldn't find it. I needed to
right-click the project name, select properties, select Run under
categories, and add a VM Options: entry of
-Djava.library.path="C:\where-ever-you-stuck-rxtxSerial.DLL-file;%PATH%
Example:
-Djava.library.path="C:\rxtx-2.1-7-bins-r2\Windows\i368-mingw32\;%PATH%"
While I'm sure there is more than one way of adding the directory to
your path, this worked for me. Note I did the default NetBeans 5.5/JDK
1.6.0 isntall accepting all the default options(ie clicking next until I got to finish), so I haven't modified my java paths or anything.
Alternatively you can copy the *.dll into C:\Windows\System32\, Java
will find it there automatically.
Note that you cannot use the 32bit DLL when running a 64bit JRE:
You will get an error similar to:
Can't load IA 32-bit .dll on a AMD 64-bit platform thrown while loading gnu.io.RXTXCommDriver
To solve this simply install the 32bit JDK and add a new Platform in
Netbeans under Tools->Java Platforms->Add Platform and change the
project settings to use the newly created platform. make sure you type
"import gnu.io.*"
from http://rxtx.qbang.org/wiki/index.php/Using_RXTX_In_NetBeans
I had the same issue, on windows 10 and eclipse, the probelm was i had java for 32 and 64 bits, so i installed RXTX library for 64 bits but eclipse was using the 32 bits java enviroment, so what i did was download RXTX for 32 bits copy the necessary files to C:ProgramFilesx86/JAVA_HOME as in the instructions for RXTX and the problem was solved. Hope this helps anyone.
I had same problem. I was trying to run built jar file from dist folder and it was not working even it was working from NetBeans IDE. I copied rxtxSerial.dll file in dist folder where my main jar file was and it started working fine.
I was having this error before:
java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while
loading gnu.io.RXTXCommDriver
Exception in thread "Thread-7" java.lang.UnsatisfiedLinkError: no rxtxSerial in
java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:123)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.smslib.helper.CommPortIdentifier.<clinit>(CommPortIdentifier.java
:72)
at org.smslib.modem.SerialModemDriver.connectPort(SerialModemDriver.java
:69)
at org.smslib.modem.AModemDriver.connect(AModemDriver.java:114)
at org.smslib.modem.ModemGateway.startGateway(ModemGateway.java:189)
at org.smslib.Service$1Starter.run(Service.java:277)
My Java Application has JNI dll to be loaded at the beginning and we are using system.load() to load DLL with its full path. We have compiled the Java code with 64 bit JDK and dll we are trying to load is also compiled as 64 bit.
When i try to launch the Java application using java.exe at c:\windows\system32, it is successful in launching the application and when i try to launch the same Jar using the java.exe which is located in installed location i.e., %programfiles%\java\jre7\bin then it is failing with error "UnsatisfiedLinkError: The specified procedure could not be found".
Can anybody explain the difference between java.exe available in c:\windows\system32 and at installed location?
There is no difference between the two executables; They are one and the same. Your problem is your DLL location relevant to where you start the Java Environment.
The property java.library.path needs to modified to point to where your DLL is located. You can alter this property by passing -Djava.library.path=
Finally my problem is solved.
Actual problemis with libxml2. my applicat9on has dependency on libxml2. JRE 1.7.07 onards started using libxml2 and shipped into JRE location. hence there is conflict between different libxml2 DLLs. I have modified the application to load libxml2 dynamically and removed dependency.
I'm running a Java application on a Linux server that uses Tibco RV and I get the following error:
TibrvException[error=901,message=Library not found: tibrvj]
What is causing this problem?
I have already added lib path containing *.so into LD_LIBRARY_PATH but still the same result.
UPDATE:
Currently, I have <MyApp>/libs/tibrvj.jar added into classpath. The tibrvj.jar was copied from Windows environment to the Linux box where I'm running my application. I removed this from the classpath and added another reference <TibcoDirectory>/libs/tibrvj.jar and it FIXED the problem. They have different sizes with the previous file and there's probably a difference between the one copied from Windows and the one currently in the Linux box. Can someone explain why is this so?
I had the same problem, and I fixed it doing the following:
File tibrvj.jar is present in the classpath of my application
File tibrvj.dll is present via java library path. This file is usually located at bin directory in Tibco Rendezvous home directory (e.g. C:/tibco/tibrv/8.2/bin)
The installed java version is compatible with the installed tibco version.
My environment is:
Windows 7, 64bits
Tibco Rendezvous 8.2, 64bits
JDK 1.6u29, 64bits
Before, I had installed a JDK 1.6u17, for a i586 processor and when I tried to load the library using:
System.loadLibrary("tibrvj");
I got this error:
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\TIBCO\tibrv\8.2\bin\tibrvj.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
It gave me the clue to instal the correct java version.
Have you loaded the library using System.loadLibrary("tibrvj")? Have you added it to java.library.path?
Use :
java -Djava.library.path=/opt/tibco/tibrv/lib -cp {}.jar
LD_LIBRARY_PATH=/opt/tibco/tibrv/lib export LD_LIBRARY_PATH
Then **System.loadLibrary("tibrvj");**
The answers by rchavarria and DaveHowes helped, but for me the problem was that my IDE was overriding the PATH variable (and hence java.library.path) when running my project.
Removing this override made it work, as outside the IDE tibrv was already on the PATH.
Are you using Wrappers?
Do you have java.library.path set in your wrapper.conf?
I had java.library.path set in wrapper.conf, correct this value fixed the issue for me.
I'm trying to use JVLC but I can't seem to get it work. I've downloaded the jar, I installed VLC and passed the -D argument to the JVM telling it where VLC is installed. I also tried:
NativeLibrary.addSearchPath("libvlc", "C:\\Program Files\\VideoLAN\\VLC");
with no luck. I always get:
Exception in thread "main"
java.lang.UnsatisfiedLinkError: Unable
to load library 'libvlc': The
specified module could not be found.
Has anyone made it work?
You can get that exception if the dll you are trying to load requires other dlls that are not available. Sorry I can't be of more specific help, but it is something to check out. You can use depends to walk the dll dependancies.
Not sure about that NativeLibrary class. Typically when using native libraries, you need to set the system property, "java.library.path", to the location of your native libraries. As suggested, if your native library (dll, so, etc) depends on additional native libraries then the OS will takeover to resolve these dependencies. The OS will have no clue about java.library.path and beging by searching the OS specific path for native libraries. On windows this includes the current PATH environment variable as well as System32 in the windows directory. On linux this is the LD_LIBRARY_PATH / ld.conf setup.
Try setting the PATH (LD_LIBRARY_PATH) to point to the same location as java.library.path. The only catch is that you can't set this one your process launches (the JVM), it's already too late. You need to have the environment set BEFORE the JVM launches. You can do this vis batch files, shell scripts, Ant, or directly from your IDE.
I had the same problem too and I noticed that it occured only with 64-bit jdk/jre.
Works like charm with 32-bit jdk under Win7 x64.
Have a nice coding!
-Sipe
You should try
System.load("C:\\Path\\To\\libvlc.dll");
at least to verify that your library can be loaded.
And if not, it may give you useful error messages (it did for me).
(And as Sipe mentioned, you may be using a 64 bits JRE/JDK, in which case libvlc will never be found (it's 32 bits only). In this case you must switch to using a 32 bits JRE/JDK.)