I have a test case where I am trying to access the C code from my JAVA program using JNI. Steps involved are as follows :
1. A JAVA program calling the native 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) {
new RunnerClass().win32_svc_install();
}
}
2. Now after the [.class] file gets generated and from that corresponding [.h] file created, I put up the native method implementation inside the [.c] file.
#include <jni.h>
#ifndef _Included_RunnerClass
#define _Included_RunnerClass
#ifdef __cplusplus
extern "C" {
#endif/*
* Class: RunnerClass
* Method: nx_win32_svc_install
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_RunnerClass_win32_1svc_1install
(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif
The
RunnerClass.c file has the implementation for the native method inside it. What exactly this method will do is call the ServiceManager of the windows to make use of it. My JAVA program needs to perform these actions.
Now the problem arises after the
[testDll.dll] gets created. Before interpreting the JAVA code, I set the library_path for the required library(testDll) in the java.library.path.
Now when I RUN my program, my library gets loaded but it throws UnsatisfiedLinkError to the native method. The exact error is as follows :
Exception in thread "main" hello ,java.lang.UnsatisfiedLinkError: RunnerClass.parsecmdline(ILjava/lang/String;)V
at RunnerClass.win32_svc_install(Native Method)
at RunnerClass.main(MainWs.java:58)
I did a lot of research and understood by far that the exception is thrown because the program is not able to find the implementation of the native method in the library being loaded.
I have been stuck here since last three days now and really need a solution that best resolves my existing problem.
Thanks in advance!