Call a 86x Dll from Java



我试图从Eclipse上的一个java项目中调用我使用VC 6创建的x86 DLL,第一次尝试时我收到一个错误,说我无法从x64环境中调用x86 DLL,并且无法加载该DLL。所以我安装了一个x86jre,对DLL充电就没有问题了。但是当我尝试调用我的c++函数时,我会得到以下异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: mm.SimpleDLL.SimpleDLL_Calculation_Add(II)I

有人能帮帮我吗?非常感谢。

SimpleDLL.h

#ifndef SIMPLE_DLL_H
#define SIMPLE_DLL_H
namespace SimpleDll
{
extern class Calculation
{
public:
static __declspec(dllexport) int Add(int a, int b);
};
}
#endif SIMPLE_DLL_H

SimpleDLL.cpp

#include "SimpleDll.h"
namespace SimpleDll
{
int Calculation::Add(int a, int b)
{ return a + b; }
}

SimpleDLL.java

package mm;
public class SimpleDLL {
static
{
System.load("D:\SimpleDLL.dll");   
}
public static void main(String ar[])
{
System.out.println("Hello world from Java");
SimpleDLL t=new SimpleDLL();
int x = t.SimpleDLL_Calculation_Add(6, 7);
System.out.println("Resultat  "+x);
}
public native int SimpleDLL_Calculation_Add(int a, int b);
}

导出的DLL函数视图

使用JNA库解决问题后,我使用链接遍历

您需要使用javah构建一个32位DLL和一个.h文件,以获得Java所期望的确切签名。它通常类似

JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod
(JNIEnv *, jobject, jboolean);

来自https://medium.com/@bschlining/a-simple-java-nactive-interface-jni-example-in-java-and-scala-68fdafe76f5f

另一种方法是使用像JNA或JNR-FFI这样的库,它允许您在不编写桥接代码的情况下绑定到C库。

最新更新