使用包含第三方dll的JNI DLL时出现UnsatisfiedLinkException

时间:2019-08-21 11:34:35

标签: java c++ dll visual-studio-2015 java-native-interface

我试图构建本机包装DLL,以便从Java访问第三方DLL。在运行我的Java程序时,它会引发未满足的链接异常。

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\sstankov\workspace\CalculatorWrapper\src\CalculatorControllerWrapper.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at CalculatorController.<clinit>(CalculatorController.java:9)

我已经通过无数的SOF帖子查看了有关同一问题的信息,可惜没有任何帮助。

这是我的代码,我认为它应该可以使您有所了解。

我创建并命名为TestHelloWorld的“ 3d-party-dll”的标题:

#include <iostream>
using namespace std;

namespace Calc {

    class CalculatorSasa
    {
    public:
        static __declspec(dllexport) int multipliziere(int a, int b);
        static __declspec(dllexport) int addiere(int a, int b);
        static __declspec(dllexport) int subtrahiere(int a, int b);
    };


}

CPP-第三方DLL的文件

#include "TestHelloWorld.h"
#include <iostream>
using namespace std;

namespace Calc{

    int CalculatorSasa::addiere(int a, int b) {
        cout << "a = " << a << ", b = " << b << endl;
        int c = a + b;
        cout << "\Ergebnis Addieren = " << c << endl;
        return c;
    }

    int CalculatorSasa::multipliziere(int a, int b) {
        cout << "a = " << a << ", b = " << b << endl;
        int c = a * b;
        cout << "\Ergebnis Multiplizieren = " << c << endl;
        return c;
    }

    int CalculatorSasa::subtrahiere(int a, int b) {
        cout << "a = " << a << ", b = " << b << endl;
        int c = a - b;
        cout << "\Ergebnis Subtrahieren = " << c << endl;
        return c;
    }

}


int main()
{
    return 0;
}

CalculatorController.java-> Java代码

public class CalculatorController {

    public static native int add(int a, int b);
    public static native int subtract(int a, int b);
    public static native int multipliziere(int a, int b);

    static{
        System.loadLibrary("CalculatorControllerWrapper");
    }


    public static void main(String[] args) {
        /* This message will help you determine whether
        LD_LIBRARY_PATH is correctly set
         */
        System.out.println("library: "
                + System.getProperty("java.library.path"));

        CalculatorController.add(10, 20);
        CalculatorController.subtract(50, 15);
        CalculatorController.multipliziere(10, 10);


    }

}

我的Java类创建的本地标题

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

#ifndef _Included_CalculatorController
#define _Included_CalculatorController
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     CalculatorController
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_CalculatorController_add
  (JNIEnv *, jclass, jint, jint);

/*
 * Class:     CalculatorController
 * Method:    subtract
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_CalculatorController_subtract
  (JNIEnv *, jclass, jint, jint);

/*
 * Class:     CalculatorController
 * Method:    multipliziere
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_CalculatorController_multipliziere
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

本机头的C ++实现

#pragma comment(lib, "Calculator.lib")

#include "CalculatorController.h"
#include "TestHelloWorld.h"
#include <iostream>

/*
 * Class:     CalculatorController
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_CalculatorController_add(JNIEnv *env, jclass cls, jint num1, jint num2) {
    int sum = Calc::CalculatorSasa::addiere(num1, num2);
    return sum;
}

/*
 * Class:     CalculatorController
 * Method:    subtract
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_CalculatorController_subtract(JNIEnv *env, jclass cls, jint num1, jint num2) {
    int sum = Calc::CalculatorSasa::subtrahiere(num1, num2);
    return sum;
}

/*
 * Class:     CalculatorController
 * Method:    multipliziere
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_CalculatorController_multipliziere(JNIEnv *env, jclass cls, jint num1, jint num2) {
    int sum = Calc::CalculatorSasa::multipliziere(num1, num2);
    return sum;
}

我认为也许我在某处存在建筑和/或编译错误。我是C ++的新手,因为我是一名纯Java开发人员,并且从工作中获得了此Task。

这也是我的src文件夹的图片,蓝色表示与java / jni相关的文件,红色表示“第三方dll”: blue describes java/jni related files, red the "3rd party dll"

谢谢!

0 个答案:

没有答案
相关问题