java - 异常在线程 "main"java.lang.UnsatisfiedLinkError : RunnerClass. parsecmdline(ILjava/lang/String;)V

标签 java c exception java-native-interface unsatisfiedlinkerror

我有一个测试用例,我试图使用 JNI 从我的 Java 程序访问 C 代码。涉及的步骤如下:

<强>1。调用 native 方法的 Java 程序:

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。现在,在生成 .class 文件并从创建相应的 .h 文件后,我将本地方法实现放在 .c 文件中.

    /* 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

RunnerClass.c 文件中包含本地方法的实现。该方法的确切作用是调用窗口的 ServiceManager 来使用它。我的 Java 程序需要执行这些操作。

现在问题出现在 testDll.dll 创建之后。在解释Java代码之前,我在java.library.path中设置了所需库(testDll)的库路径。

现在当我运行我的程序时,我的库被加载但它向本地方法抛出 UnsatisfiedLinkError。具体错误如下:

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)

我做了很多研究,到目前为止我明白抛出异常是因为程序无法在正在加载的库中找到 native 方法的实现。

最佳答案

异常确实与您的代码不匹配。 在 Java 中,您将函数声明为

public native void win32_svc_install();

在c++中,你将函数声明为

JNIEXPORT void JNICALL Java_RunnerClass_win32_1svc_1install (JNIEnv *, jobject);

我认为应该声明为

JNIEXPORT void JNICALL Java_RunnerClass_win32_svc_install (JNIEnv *, jobject);

但是除了c++声明中奇怪的“1”之外,似乎还有一个问题。 这两个函数都被正确声明为具有零参数的 void 函数。

但是您的异常指出,它正在寻找一个同名的 void 函数,但带有一个整数和一个字符串参数:

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

在查看您的代码时,我无法想象为什么。我试图通过重命名我的一个 C++ 函数来重现它;以下未满足的链接异常正确说明了定义的参数。

关于java - 异常在线程 "main"java.lang.UnsatisfiedLinkError : RunnerClass. parsecmdline(ILjava/lang/String;)V,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15449573/

相关文章:

java - ScheduledExecutorService 在给定时间段内以给定时间速率执行任务

java - 避免 javax.servlet.ServletException

java - 在 JBoss 中的 JNDI 树上保留字节数组

c - 我在使用 C 中的函数指针数组时遇到问题

c - 在 C 中计算二次和 x 轴之间面积的程序

c# - 使用大量的 `try` 而不是更多的 `if` 是否可以?

java - 安装 Hadoop、Java 关于索引 7 处非法字符的异常?

c - 两个进程读取相同的标准输入

android - 共享库中的异常处理

java - 在Java中使用异常处理强制用户输入字符(字母)而不是字符串