Jna调用动态链接库

最近由于工作需要,在和其它系统交互的问题上不仅仅是WebService的交互,还需要利用Java调用其它语言编写的动态链接库,例如编译好的dll文件.好,简单看一下这个问题的来源。

我们的系统和其它系统进行交互的时候,需要网络这个阶段,这段期间数据很容易被截获,这就需要对一些敏感的数据进行加密。通常单个系统我们会用MD5进行加密,无法逆向破解,相对来说还是比较安全的,已经足够使用了。但是为了网络中传输的数据也是密文,这就需要再次进行加密了,所谓的私钥,公钥。经典的例如:DES,加强版3DES等。好先看一下简单流程:

这种情况下,A系统是建立在B系统的基础之上的,随意加密算法我们需要和B用一套,一般情况下,用B系统语言写的(当然A也可以),A是利用Java进行开发的,B是利用delphi,C,C++等编写的,所以我们就需要利用Java来调用其他语言编译好的Dll等文件,就像我们Java的.class文件一样。好这里看一种比较方便简单使用的JNA。

JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

优点:JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且调用本地方法还不用额外的其他处理或者配置什么的,也不需要多余的引用或者编码,使用很方便。

简单看一下流程操作,首先下载jna.jar,并引入到项目中,然后看一下下边的代码

package com.ljh.until;

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

/**
 * 测试jna调用本地接口
 * @author ljh
 *
 */
public class testJna {
	//上层接口
	//需要继承stdCallLibrary,一种协议,当然也可以直接继承Library上层接口,看对方的DLL文件的编写遵从哪一种协议, 这个是jna标准
    //必须定义一个接口,将Dll文件的方法提取出来,注意类型的对应
	public interface EncrypStrTest extends StdCallLibrary {

		 //加载动态链接库,把库dll文件默认放到系统C盘window目录下的system32文件夹下或者到java的bin目录
		EncrypStrTest instance = (EncrypStrTest)Native.loadLibrary("Dll文件的名字", EncrypStrTest.class);
		//定义接口,
		public String EncrypString(String aSrc, String aKey);//定义接口

	}

	//测试
	public static void main(String[] args) {
		try{
			EncrypStrTest jnaDemo=EncrypStrTest.instance;

			String resultString=jnaDemo.EncrypString("参数一","参数二");
			System.out.println("会有结果么:" + resultString);
		}catch(Exception e){
            e.printStackTrace();
        }
	}

}

这样我们就可以调用其它语言的dll控件了,而windows本身提供了很多dll控件我们就可以通过JNA进行本地方法的调用了,这样大大扩展了Java程序的面。非常方便的,当然了还有其他方法,不断学习中……

时间: 2024-08-11 09:57:30

Jna调用动态链接库的相关文章

Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27

Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27 1. Jna简单介绍1 2. Jna范例halo owrld1 3. Jna概念2 3.1. (1)需要定义一个接口,继承自Library 或StdCallLibrary2 3.2. 2)接口内部定义2 4. 数据类型映射 NA官方给出的默认类型映射表如下:3 5.  JNA能完全替代JNI吗?3 6. 参考4 1. Jna简单介绍 原来使用JNI,你必须手工用C写一个动态链接库,在C语言中映射Ja

Atitit.java jna 调用c++ dll 的总结

Atitit.java jna 调用c++ dll 的总结 1. JNA技术解密1 1.1. JNA工作原理1 2. JNA技术难点 Java—C和操作系统数据类型的对应表1 2.1. 1 2.2. JNA编程过程3 2.2.1. 跨平台.跨语言调用的第一原则:就是尽量使用基本.简单的数据类型,尽量少跨语言.平台传递数据!4 3. 参考4 1. JNA技术解密 1.1. JNA工作原理 JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数.

Java框架JNA调用C方法(windows链接库dll文件、linux链接库so文件)

介绍 给大家介绍一个最新的访问本机代码的Java框架-JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架. JNA项目地址:https://jna.dev.java.net/ 非常强大.易用,功能上类似与.NET的P/Invoke. 不堪回首的JNI 我们知道,使用JNI调用.dll/.so共享类库是非常非常麻烦和痛苦的. 如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另

JNA调用库文件

最近项目中要集成厂商的卡口摄像头,需要通过jna调用库函数接收卡口相机抓拍的过车数据.本文记录了Java调用C语言动态库(jna)的调用方式.回调函数.结构体等. JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架,主要解决jni调用其他语言繁琐的步骤.JNI是Java Native Interface的缩写,它提供了若干的api实现了Java和其他语言的通信(主要是c&c++). jna 官方github:https://github.com/j

Linux下JNA 调用 so 库

原文:https://blog.csdn.net/withiter/article/details/8077470 博文链接:https://i.cnblogs.com/EditPosts.aspx?opt=1在linux下使用jna调用本地方法的时候,需要将C写成的程序编译为so文件 1.写一个简单test.c文件: #include<stdio.h>int add(int a,int b);int add(int a,int b){      int c = a + b ;      re

JNA调用DLL简单使用

java系统中调用dll动态链接库需要用到JNA作为桥接工具,特此记录一下JNA的使用方式. 引入JNA的jar包 直接下载或者通过maven导入jar包,maven引入版本为5.5.0的JNA配置如下 <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform --> <dependency> <groupId>net.java.dev.jna</groupId> <ar

VC与Matlab混合编程之调用动态链接库dll(C++)——&lt;二&gt;

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -W cpplib:ellipsefit ellipsefit.m -T link:lib (此方式为c++风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序

JNA调用Delphi7的DLL传递接收中文参数的方法

项目要写个DLL调用硬件,因为人力资源的原因只能用Delphi7开发,结果发现传递中文有点问题,研究了一番后解决,其实很简单,关键是使用system.pas下的编码解码方法.以下在本机测试通过. 环境: Win7 64位旗舰版 JDK1.6 x86 MyEclipse8.6 Delphi7 Delphi代码: library Project2; uses SysUtils, Dialogs; {$R *.res} function testDLL(sInput: PChar):PChar; st

VC++ 6.0如何创建与调用动态链接库

原文:http://blog.csdn.net/wanghaihao_1/article/details/51098451 1.静态链接库与动态链接库区别: 静态链接库:lib中的指令被直接包含在最终生成的EXE文件中. 动态链接库:dll不必被包含在最终的EXE中,EXE文件执行时可以动态地引用和卸载DLL文件. 同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库. 2.VC++支持的DLL: DLL的编制与具体的编程语言及编译器无关,动态链接库随处