Using JNI Produced Jar Files: java.lang.UnsatisfiedLinkError

C

clusardi2k

On Windows 7, I am trying to use the JNI (Java Native Interface) to invoke a C++ method from java NetBeans 7.1.2 (Java SE Development Kit 7u4 x86 32-bit).

Background: I was given two dot jar files (produced using the NetBeans JNI process) to use in a project. The filenames of these two JNI produced filesbegin with "java".

My simple project consists of another dot java file. I'm, basically, just converting a working C++ project to a java project.

Below, I first import the JNI C++ class described via the associated jar file(s). The import information came from the JavaBeans "Projects" window listing above all the available JNI class names.

import com.one.two.three.My_Class;
//import com.six.seven.eight.*;

Second, in a java program constructor, I invoke the following static method:

My_Class.a_first_test();

(I know the above method is static because the similar C++ program runs perfectly.)

Problem Description: This java project compiles. But when I run the program, I receive the below error message.

run:
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: com.one.two.three.four.five_init()V
at com.one.two.three.four.five_init(Native Method)
at com.one.two.three.four.<clinit>(four.java:4746)
at com.one.two.three.My_Class.a_first_test(My_Class.java:51)
at My_Prj.<init>(My_Project.java:28)
at My_Prj$11.run(My_Project.java:585)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
at java.awt.EventQueue.access$000(EventQueue.java:102)
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread..java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread..java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

My employeer told me I should not make public identifier names etc, so (above) I have carefully renamed code identifiers.

------

Here are the steps that I followed to try to fix the problem. These steps did not work!

(0) FYI: The contents of the jar files match (viewed via command jar tf jar-file) what is displayed by NetBeans.

(1) To gather information, I put the following line of code as the first line in the constructor:

System.out.println(System.getProperty("java.library.path"));

I ran this program. The line of code gave me paths to folders such as:

C:\Program Files\Java\jdk1.7.0_04\bin;
C:\Windows\Sun\Java\bin;
C:\Windows\system32;
C:\Windows;
C:\Program Files\QuickTime\QTSystem\;
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;
C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;
C:\Program Files\Microsoft SQL Server\90\Tools\binn\;.

(2) Since there was also a beansbinding-1.2.1.jar (and associated dot dll file) file in my project, I looked for two dot dll files that correspond to the two dot jar files given to me. I found none that had "java" pre-appended to the filenames, but I found two without "java" pre-appended to the filenames. So, I just copied and renamed the two files that I found and put them in one of the folders produced from step 1.

(3) Because of the beansbinding-1.2.1.jar file in my project, I copied my two dot jar files to the same folder. I did not rename any of the dot jar files.

(4) I compiled and ran the project in NetBeans, but I received the exact same error message.

------

Some References:

Error message:
http://stackoverflow.com/questions/...ue-0-java-lang-unsatisfiedlinkerror-no-jnotif

Setting environment variable CLASSPATH required:
http://www.webdeveloper.com/forum/archive/index.php/t-60643.html

Thank you,
 
C

clusardi2k

The following link contains a book describing a similar runtime error to mine. The book says I am missing a "DLL" (Dynamic Link Library)!

http://java.sun.com/docs/books/jni/

So, I have to try and determine where/how to get/build a DLL! Anybody have any ideas?

My own large set of C++ routines has a dot jar file which allows me to compile and link my java project together. (I import the classes after adding the jar to the project.)

Question: Can I create (with NetBeans) a DLL from my dot jar file, any suggestions.

Referenced Book: The Java Native Interface Programmer’s Guide and Specification by Sheng Liang (published 1999)

On Page 31 of the pdf:

java.lang.UnsatisfiedLinkError: no HelloWorld in library path
at java.lang.Runtime.loadLibrary(Runtime.java)
at java.lang.System.loadLibrary(System.java)
at HelloWorld.main(HelloWorld.java)

Thanks for any help,
 
C

clusardi2k

One alternative to using the dot jar file would be to throw the dot jar away, Thus, I could build a C++ class (in NetBeans per JNI) that uses a small subset of the class' mentioned in the large dot jar file, and just use JNI to communicate with a java NetBeans project!

A second alternative would be to also not use the dot jar file, build a C++class (maybe in NetBeans or Visual Studio) that uses a small subset of theclass' mentioned in the dot jar file, have the C++ program write all the required data to a file, and use a java NetBeans project to read from the new file after first invoking the corresponding C++ project!
 
R

Roedy Green

My requirements are to use NetBeans and a dot jar file.

You can can use NetBeans to develop JWS, and JWS is implemented with
an ordinary .jar file. You may imagine that JWS is something other
than Java. It is just an ordinary java jar plus a *.jnlp file. There
are some JWS classes you can use to write an installer, but you don't
have to use any of them.
--
Roedy Green Canadian Mind Products
http://mindprod.com
If you look in a computer programmer's freezer you will find all
kinds of containers, but none of them labeled. They do the same thing
creating files without labeling the encoding. You are just supposed to
know. Ditto with the MIME type, the separator and comment delimiters and
column names in CSV files. Ditto with the endian convention. Imagine how
much more civilised life would have been if Martha Stewart were the first
programmer.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,968
Messages
2,570,154
Members
46,702
Latest member
LukasConde

Latest Threads

Top