[JNA系列]Java调用Delphi编写的Dll之JNA使用
介绍
给大家介绍一个最新的访问本机代码的 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 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替代 C 语言的数据结构,调用已有的 dll/so 中公布的函数。
然后再在 Java 中载入这个适配器 dll/so ,再编写 Java native 函数作为 dll 中函数的代理。
经过 2 个繁琐的步骤才能在 Java 中调用本地代码。
因此,很少有 Java 程序员愿意编写调用 dll/.so 库中的原生函数的 java 程序。这也使 Java 语言在客户端上乏善可陈。可以说 JNI 是 Java 的一大弱点!
.NET平台上强大的 P/Invoke
而在 .NET 平台上,强大的 P/Invoke 技术使我们 Java 程序员非常羡慕。使用 P/Invoke 技术,只需要使用编写一个 .NET 函数,再加上一个声明的标注,就可以直接调用 dll 中的函数。
不需要你再使用 C 语言编写 dll 来适配。
不逊于 P/Invoke的 JNA
现在,不需要再羡慕 .NET 的 P/Invoke 机制了。 JNA 把对 dll/.so 共享库的调用减少到了和 P/Invoke 相同的程度。
使用 JNA ,不需要再编写适配用的 .dll/.so ,只需要在 Java 中编写一个接口和一些代码,作为 .dll/.so 的代理,就可以在 Java 程序中调用 dll/so 。
[JNA系列]Java调用Delphi编写的Dll之JNA使用的更多相关文章
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PWideChar
Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessWide(pvData: P ...
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PAnsiChar
Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessAnsi(pvData: P ...
- [JNA系列]Java调用Delphi编写的Dll之Delphi与JAVA基本数据类型对比
Delphi与JAVA基本数据类型对比 类型 Delphi关键字 JAVA关键字 字节 备注 范围 整型 Shortint byte 1 有符号8位 -128..127 Byte 1 无符号8位 0 ...
- nodejs调用delphi编写的dll
公司的业务需要,nodejs要读取文件版本号. 同事要求我用delphi编写dll,以供nodejs调用,结果通过json返回. delphi代码如下: function GetFileInfo(AP ...
- C# 调用delphi编写的dll
技术实现 如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可: #define LIBEXPORT_API extern "C" __declspe ...
- Go调用Delphi编写的DLL
参数整数没有问题,但是如果是字符串,要注意几个细节. 记录如下: 1.Delphi定义函数的时候,字符串参数需要使用PChar类型 2.Go传递参数的时候要将字符串转成UTF16的指针,接收的时候采用 ...
- 分享一次C#调用Delphi编写Dll程序
1.前言: 最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C ...
- 【转载】java调用C++写的DLL
用java调用C++写的DLL一直以来都是一个比较麻烦但又很常见的问题. 我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦的. 如果有一个现有的 .dll/.so 文件,如 ...
- 实现通过COM组件方式实现java调用C#写的DLL文件的完整demo
最近因为工作需要,客户那边工程师使用的是JAVA语言开发的程序,我们这边平台中是用C#语言开发的,因为有些操作必须统一,所以我在网上查找解决方法,自己也实践过,在这里做个笔记吧,分享一下. 声明:下面 ...
随机推荐
- ylbtech-LanguageSamples-UserConversions(用户定义的转换)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-UserConversions(用户定义的转换) 1.A,示例(Sample) 返回顶部 ...
- iOS:UIView、UIControl、UIButton、UILabel简单的属性和方法常识
常见属性和方法 一 .UIVIew 常见属性 1.frame 位置和尺寸(以父控件的左上角为原点(0,0)) 2.center 中点 (以父控件的左上角为原点(0,0)) 3.bounds 位置和尺寸 ...
- iOS:转载:同步、异步、并行、串行的详解
理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念 2014年11月21 ...
- gmock学习01---Linux配置gmock
本文目的 本文主要介绍gmock 1.6.0版本在Linux上如何部署和使用. gmock是做什么的? 使用C++手动编写mock对象将会是一件十分耗时,易于出错,枯燥乏味的事情.gmock提供一整套 ...
- 【转载】Java 的开发效率究竟比 C++ 高在哪里?
哈哈哈,太好笑了 https://www.zhihu.com/people/ze.ran ze ran编程话题优秀回答者 less is more 人赞同 C++是面向内存编程,Java是面向数据结构 ...
- scrapy-splash抓取动态数据例子一
目前,为了加速页面的加载速度,页面的很多部分都是用JS生成的,而对于用scrapy爬虫来说就是一个很大的问题,因为scrapy没有JS engine,所以爬取的都是静态页面,对于JS生成的动态页面都无 ...
- 往aws中的s3上传数据
在官网下载对应的sdk http://aws.amazon.com/cn/sdk-for-net/ 然后再aws上为s3上的bucket生成密钥对 access_key和secret_key 调用对应 ...
- Shiro(4)默认鉴权与自定义鉴权
=========默认鉴权======== 过滤链中定义: <!-- 过滤链定义 --> <property name="filterChainDefinitions&qu ...
- ios中Core Location跟Map Kit的基本使用
地图类开发应用中,离不开地理位置跟MKMapView的使用,下面就记录下自己在使用这两个东西中学到的. 不过并不是所有苹果的设备都支持地理位置,我们在使用前应该做个判断,代码如下: BOOL loca ...
- Leetcode--easy系列5
#83 Remove Duplicates from Sorted List Given a sorted linked list, delete all duplicates such that e ...