I have a test case where I am trying to access C code from my Java program using JNI. The following steps apply:
1. Java program calling its own methods:
public class RunnerClass{ public native void win32_svc_install(); static{ System.loadLibrary("testDll"); System.out.println("library loaded successfully"); } public static void main(String[] args) {
2. Now, after creating the .class file and creating the corresponding .h file, I turned on the implementation of the built-in method inside the .c file.
/* DO NOT EDIT THIS FILE - it is machine generated */ //RunnerClass.h #include <jni.h> /* Header for class RunnerClass */
The RunnerClass.c file has an implementation of the built-in method inside it. What exactly this method will do is call the ServiceManager from windows to use it. My Java program should do this.
Now the problem occurs after creating testDll.dll . Before interpreting the Java code, I set the library path for the required library ( testDll ) in java.library.path .
Now, when I run my program, my library loads, but it throws an UnsatisfiedLinkError on its own method. The exact error is as follows:
Exception in thread "main" hello ,java.lang.UnsatisfiedLinkError: RunnerClass.win32_svc_install(ILjava/lang/String;)V at RunnerClass.win32_svc_install(Native Method) at RunnerClass.main(MainWs.java:58)
I did a lot of research and realized that the exception was thrown because the program could not find the implementation of its own method in the loadable library.
source share