java.lang.UnsatisfiedLinkError

I use a wrapper class HiResTimer (JavaPro Aug.01 p67) which loads a DLL hirestimer.dll in the same directory ( System.loadLibrary("hirestimer");). Everything worked fine. But when I added a package definition to specify a package name, the DLL was loaded, the wrapper class instantated, but on the first call of a method I get a "java.lang.UnsatisfiedLinkError: isHighResTimerAvailable". What's the problem?
hajavaAsked:
Who is Participating?
 
heyhey_Connect With a Mentor Commented:
I changed the C++ code like this
JNIEXPORT jboolean JNICALL Java_ch_abegglen_nativ_HiResTimer_isHighResTimerAvailable


well that was exactly my suggestion - to use correct .dll entry name (that includes all the package/method/parameters info)

sorry for not posting earlier comment - my main workstation was down for 10 days ...
0
 
objectsCommented:
Which directory is your library in?
0
 
hajavaAuthor Commented:
The library is in directory H:\java\ch\abegglen\nativ. The class is in the same directory. Classpath is H:\java. The intended package name was ch.abegglen.nativ.
0
Cloud Class® Course: Python 3 Fundamentals

This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

 
objectsCommented:
Try putting the lib in h:\java or somewhere in your PATH.
0
 
heyhey_Commented:
> "java.lang.UnsatisfiedLinkError: isHighResTimerAvailable"

it seems that you have changed 'package' statement for some class that contains native methods. since .dll entry for each native method contains full class/package/parameter signatures, when you chnage the package, JavaVM won't be able to find the native method in the .dll.

check the JNI tutorial at www.javasoft.com
0
 
hajavaAuthor Commented:
heyhey wrote: "since .dll entry for each native method contains full class/package/parameter signatures"

How do I add <package name> to the signature?

In the tutorial I find only one sentence about packages:
"The name of the native language function that implements the native method consists of the prefix Java_, the package name, the class name, and the name of the native method. Between each name component is an underscore "_" separator."

The JNI Spec has an example for a package:
Java_pkg_Cls_f_ILjava_lang_String_2
//where pkg is the package name

But I tried
//hirestimer.cpp
JNIEXPORT jboolean JNICALL Java_ch_abegglen_nativ_HiResTimer_isHighResTimerAvailable
  (JNIEnv *, jobject)
//where ch.abegglen.nativ is the package name
does not have the desired effect. I still have a java.lang.UnsatisfiedLinkError: isHighResTimerAvailable. And this is *after* the library has been loaded from C:\WINDOWS which is in my PATH.

0
 
hajavaAuthor Commented:
I found the solution, thanks anyway.

I changed the C++ code like this

JNIEXPORT jboolean JNICALL Java_ch_abegglen_nativ_HiResTimer_isHighResTimerAvailable
  (JNIEnv *, jobject)

where ch.abegglen.nativ is the package name. Then I called javah with parameter -classpath %cp% ch.abegglen.nativ.HiResTimer. The resulting HiResTimer.h allowed to compile a usable DLL then.

The DLL can reside in the package directory, not as you suggested.

Thanks.
0
 
VenabiliCommented:
No comment has been added lately, so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area that this question is:

- Points for heyhey_

Please leave any comments here within the next seven days.

PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!

Venabili
EE Cleanup Volunteer
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.