Java调用C语言动态库

过程主要分为以下几个步骤:

1、vs2017编写cpp/h代码,编译成dll,编译成功后,用depends查看库的依赖是否有缺失,也可以自己写个demo,调用这个dll中的函数,是否可以调用成功作为验证这个dll是否ok的方法。

注意:编译这个dll的cpp和h文件时,注意要extern "C",

eg:

cpp:

一定要注意红框的宏,不然会在java调用这个方法时提示:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function

2、将dll加入到jna 的jar包中,一般用好压打开,然后找到对应的目录,比如:java使用的是x64的jdk,dll也必须要是x64的,这个在编译dll时候选择,选择的方式如下:

第一次使用的时候,没有x64,新加一个就好了,具体可以百度怎么新加一个。如果二者不都是x64或者x86,java在使用的时候会提示找不到dll:

java.lang.UnsatisfiedLinkError: Unable to load library 'jndadll': Native library (win32-x86-64/jndadll.dll) not found in resource path

在确保dll可用的时候,将dll加入jna的jar包,一般用好压打开,然后放到对应的目录,我的是win32_64的,对应的目录是:com\sun\jna\win32-x86-64 直接拖进去就行。

3、idea工具编写demo使用jna中的c函数:

(1)、idea新建java工程

(2)、使用这个jna.jar包,方法:

注意红框中的操作步骤。

(3)、编写java代码:

public class TestJNA {

    public interface CLibrary extends Library{
        CLibrary INSTANCE = (CLibrary)Native.load("jndadll", CLibrary.class);
                int checksum(String src_data, IntByReference check_ret);
    }
    
    public static void main(String[] args) {
        // write your code here
        IntByReference check_ret = new IntByReference();
        int flag = TestJNA.CLibrary.INSTANCE.checksum("123",check_ret);
        System.out.println("MainActivity, checksum的返回标记:" + flag);
    }

}

(4)、编译java,执行即可以了。其他使用可以参考jna官网手册java-native-access/jna