Java调用C++/C编译导出的动态库(Dll/so)一次记录

456 阅读1分钟

最近工作中遇到需要使用Java程序调用旧有C/C++程序导出的动态库的需求,查询资料得知有以下几种方式:

  1. JNI调用
  2. JNA调用 两种方式的异同:都可以实现Java对Dll/SO动态库的调用,不同的是,JNI也可以实现C、C++对Java程序的调用,JNA却不能。
    下面记录下本次过程:
    JNI的调用过程,我在Windows 10环境下未能正常调用,所以转向JNA的调用。
    使用的开发工具,JetBrains IDEA和 Clion,都是该家族产品。
    首先,IDEA新建一个Maven项目工程,引入JNA的依赖,当前记录时的JNA版本为5。8。0
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.8.0</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>5.8.0</version>
</dependency>

然后新建一个java类,名为Test。

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.ptr.IntByReference;

public class Test {

    static final String dllLibName="testdll"

    public static void main(String[] args){
        byte[] buff = new byte[10];
        IntByReference leng = new IntByReference();
        int result = CLibrary.INSTANCE.Get("aabbcc",buff,leng);
        System.out.println(result);
        System.out.println(leng.getValue());
        System.out.println(Arrays.toString(buff));
    }
    public interface CLibrary extends Library{
    //DLL文件默认路径为项目根目录,或在另外位置,请使用绝对路径。
    //大家注意这里的动态库的名字,windows下是Lib+动态库名字,Linux下是不一样的,这里假设动态库名字一致情况下.
    CLibrary INSTANCE = (CLibrary) Native.load((Platform.isWindows() ? "lib" + dllLibName : dllLibName), CLibrary.class);
    //声明将要调用的动态库中的方法,可以有多个方法.
    int Get(String id,byte[] buff,IntByReference leng);
    }
}