Java如何调用本地dll库里面的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java如何调用本地dll库里面的方法相关的知识,希望对你有一定的参考价值。

JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
简单介绍及应用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static
System.loadLibrary(“goodluck”);


在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为:
public class testdll

static

System.loadLibrary("goodluck");

public native static int get();
public native static void set(int i);

public static void main(String[] args)

testdll test = new testdll();
test.set(10);
System.out.println(test.get());



用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件
参考技术A jni了解一下

使用 loadLibrary() 在 java 中调用 c++ dll

【中文标题】使用 loadLibrary() 在 java 中调用 c++ dll【英文标题】:calling a c++ dll in java with loadLibrary() 【发布时间】:2014-10-22 12:14:37 【问题描述】:

我在用 Java 加载 c++ dll 时遇到问题。当我使用下面的 Java 代码(loadLibrary)时,我得到了这个错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: TestJNI.Add(II)V

我该如何解决这个问题?

public class TestJNI 

   public native void Add(int a,int b);

   static 

      System.loadLibrary("dllclass");

   

   public static void main(String args[]) 

          new TestJNI().Add(1,2);
       

除了头文件,我没有c中的源代码,它使用这个代码

int APIENTRY(dllexport) add(int a, int b);

如果您对C语言或java代码或示例代码有任何建议,请介绍。

【问题讨论】:

至少你需要告诉我们你的Add函数是如何在C++中定义的。 你确定函数是从dll导出的吗?你确定 dll 在 PATH 上吗? 您确定您的 Add 函数具有 JNI 定义的正确命名吗? 我将 dll 放在我的 java 项目的 bin 路径中,我在 java 中使用相同的函数名,但我不确定我使用的是相同的类名。 我使用了 Add 但现在我更改了 add,我有这个问题,它不能解决我的问题。 【参考方案1】:
    objdump 和 readelf 等工具会很有帮助。 (GCC) 函数名称格式为“_(JNIEnv *, jclass or jobject, [其余参数在此处])。(jclass 用于静态方法,jclass 用于非静态方法) 您不能直接与 Java 中的纯 c/c++ 库进行通信,您必须编写一个接口/胶水库来隧道调用。

提示: int APIENTRY(dllexport) add(int a, int b); 本机Java方法? ,见第 2 点

建议:我认为您对本机方法感到困惑。

【讨论】:

以上是关于Java如何调用本地dll库里面的方法的主要内容,如果未能解决你的问题,请参考以下文章

java中怎样调用现有的dll文件

请问java调用dll里的一个方法

易语言如何调用dll文件

Silverlight调用本地DLL文件的问题。或者说是能不能给本地的DLL文件的方法设置为关键方法。

怎么在java中调用dll中的方法

JAVA 里面如何 使用jni 给个例子 加 解释。谢谢