java - JNI java.lang.UnsatisfiedLinkError

标签 java c++ java-native-interface unsatisfiedlinkerror

我正在尝试调用一种 native 方法,但我收到“java.lang.UnsatisfiedLinkError”。

Java 类:

public class CLS_NativeData {

    private final static String sLibName = "NativeData.dll";

    private native String getValue(int i);
    private native void setValue(int i);

    public CLS_NativeData() {
        super();
    }

    static {
        System.load(CLS_Globals.LIB_PATH + sLibName);
    }

    public String getData(int i) {
        return getValue(i);
    }

    public void setData(int i) {
        setValue(i);
    }
}

C/C++ DLL 头文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class pkg_main_CLS_NativeData */

#ifndef _Included_pkg_main_CLS_NativeData
#define _Included_pkg_main_CLS_NativeData
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     pkg_main_CLS_NativeData
 * Method:    getValue
 * Signature: (I)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_pkg_1main_CLS_1NativeData_getValue
  (JNIEnv *, jobject, jint);

/*
 * Class:     pkg_main_CLS_NativeData
 * Method:    setValue
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_pkg_1main_CLS_1NativeData_setValue
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

C/C++ DLL.cpp

   JNIEXPORT jstring JNICALL Java_pkg_1main_CLS_1NativeData_getValue
        (JNIEnv * env, jobject obj, jint i) 
    {
        CoInit();

        switch(i) {
        case 0:
            return env->NewStringUTF(getCPUInfo().c_str()); 
            break;
        case 1:
            return env->NewStringUTF(getSystemInfo().c_str()); 
            break;
        case 2:
            return env->NewStringUTF(getMachineInfo().c_str()); 
            break;
        case 3:
            return env->NewStringUTF(getAntivirusInfo().c_str()); 
            break;
        case 4:
            return env->NewStringUTF(getProcessList().c_str()); 
            break;
        default:
            return env->NewStringUTF("ERROR"); 
        }
    }

    // FAILED METHOD
    JNIEXPORT void JNICALL Java_pkg_1main_CLS_1NativeData_setValue
        (JNIEnv * env, jobject obj, jint i)
    {
        switch (i) {
        case 0:
            printf("Hola mundo\n");
            break;
        }
    }

所以,当我调用第一个方法时,它工作得很好,但是当我调用第二个方法(void 方法)时,它失败了。

最佳答案

您的 Java 类的名称是 CLS_NativeData。然而,在 C++ 中你写:

Java_pkg_1main_CLS_1NativeData_getValue

并且到处使用CLS_1NativeData。它拼错了。因此类加载器无法在您的共享库中找到 native 方法并提示 java.lang.UnsatisfiedLinkError

关于java - JNI java.lang.UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18173793/

相关文章:

java - 将项目添加到资源文件

c++ - 如何将 void 指针转换为 int[3]?

java - 如何创建一个简单的 JNI 库,我可以简单地从中调用方法

java - 信号量阻塞线程但不会释放它

java - 如何在多线程 servlet 应用程序中响应 HttpServletRequest(请求)

c++ - 为什么预分配函数指针的性能比分支差?

c++ - 为什么反复调用clock_gettime时会看到400倍的异常时间?

java - 了解导致信号 11 (SIGSEGV)、代码 1 (SEGV_MAPERR) 几秒钟后出现错误的 Android 问题

java - Windows 驱动程序安装程序,它也安装 java native 库

java - 隐式转换为字符串 - toString 和 int + ""