我试图构建本机包装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”:
谢谢!