编程语言
首页 > 编程语言> > java通过JNA调用动态库

java通过JNA调用动态库

作者:互联网

前言

老规矩,先说下为什么会有这篇文章。近期对接了一个项目,应接口提供方要求,必须通过动态库调用,一个是为了安全可控,调用方不用知道内部实现,加密、解密、具体的逻辑不需要考虑,只需要调用即可;另一个是封装了统一的GUI界面。总之就是非用动态库不可,然后我查了很多资料,请教了几个大佬,最后在运气的加持下,终于调通了,但整个过程特别坎坷,所以我觉有必要记录下。需要说明的是我们这里采用的是JNA的方式

什么是动态库

说实话,一般我们不会有调用动态库的需求,因为这不是web开发的范畴,出发你涉及到嵌入式的开发,或者客户端开发。动态库也叫动态链接库,英文简写DLL,简单来讲,就是Windows下开发的程序模块,类似于java下的jar(不知道可不可以这样 理解)。它是实现Windows应用程序共享资源、节省内存空间、提高使用效率的一个重要技术手段。windows下它是以dll结尾的文件,比如:msctf.dll

百度百科给的解释是这样的:

动态链接库英文为DLL*,是Dynamic Link Library*的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。在Windows中,这种文件被称为应用程序拓展。例如,在 Windows 操作系统中,Comdlg32.dll 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于避免代码重用和促进内存的有效使用。 通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

咱也不是特别知道,咱也不敢问,你现在只有保证知道动态库这样的东西就行了。

开整

Talk is cheap. Show me the code。先上代码,然后再解释

public class DllTest {
    static {
        String filePath = "D:\\dll\\"; // 这里是你的动态库所在文件夹的绝对路径
        // 这里引用动态库和他的依赖
        System.load(filePath + "mfc100.dll");   
        System.load(filePath + "mydll.dll");        
    }

    public static void main(String[] args) {
        String strUrl = "http://127.0.0.1/test";
        String InData = "{\"data\":{\"operatorId\":\"test001\",\"operatorName\":\"超级管理员\",\"orgId\":\"123\"},\"orgId\":\"1232\"}";
        byte[] OutData = new byte[1024];

        String msg = CLibrary.INSTANCE.test(strUrl.getBytes(), InData.getBytes(), OutData);
        System.out.println(msg);
        try {
            System.out.println(new String(OutData, "GBK"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }
    // 这里是最关键的地方
    public interface CLibrary extends Library {
        // FS_CheckCode是动态库名称,前面的d://test//是路径
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary("mydll", CLibrary.class);

        // 我们要调用的动态库里面的方法。
        String test(byte[] strUrl, byte[] InData, byte[] OutData);
    }
}

动态库里面的方法是这么定义的:

char* __stdcall test(char* strUrl,char* InData,char* OutData)

解释

小朋友,你是否有很多的问号❓

标签:调用,java,String,char,JNA,bit,动态,byte
来源: https://www.cnblogs.com/caoleiCoding/p/12949048.html