简体   繁体   中英

Exception in thread “main” java.lang.UnsatisfiedLinkError: RunnerClass.parsecmdline(ILjava/lang/String;)V

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) {
        // TODO Auto-generated method stub
        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.

    /* DO NOT EDIT THIS FILE - it is machine generated */
//RunnerClass.h

#include <jni.h>
/* Header for class RunnerClass */

#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.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 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.

The exception does somehow not match your code. In Java, you declare the function as

public native void win32_svc_install();

In c++, you declare the function as

JNIEXPORT void JNICALL Java_RunnerClass_win32_1svc_1install (JNIEnv *, jobject);

I think it should be declared as

JNIEXPORT void JNICALL Java_RunnerClass_win32_svc_install (JNIEnv *, jobject);

But besides the strange "1" in the c++ declaration, there seems to be another problem. Both functions are declared correctly as a void function with zero arguments.

But your exception states, that it is looking for a void function of the same name, but with an integer and a string argument:

RunnerClass.win32_svc_install(ILjava/lang/String;)V

When looking at your code I can't imagine why. I tried to reproduce it by renaming one of my C++ functions; the following unsatisfied link exception correctly stated the defined parameters.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM