Java调用DLL有多种方式,常用的方式有JNative、JNA、JNI等。
JNative方式调用dll
JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装,可能有些读者会有这样一个问题,JNative对JNI进行了封装,并且是一种跨语言的使用DLL,会不会在效率方面很不如人意,我可以用我使用Jnative的经验告诉你,不会!因为我用Jnative就是用来处理大量的数据调用,是基于实时数据库接口的调用。而实时数据库的数据量是非常大的。
首先下载JNative,
注意:将JNative解压,并将其中的JNativeCpp.dll拷贝到system32文件夹中,libJNativeCpp.so是linux平台使用的。
代码:
[java] view plain copy
- package com.tvjody;
- import org.xvolks.jnative.JNative;
- import org.xvolks.jnative.exceptions.NativeException;
- import org.xvolks.jnative.util.Kernel32.SystemTime;
- public class Demo {
- public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
- // Kernel32.dll为dll名称,Kernel32目录的位置为:C:\Windows\System32下面,
- // GetSystemTime为Kernel32.dll中的一个方法.
- JNative nGetSystemTime = new JNative("Kernel32", "GetSystemTime");
- SystemTime systemTime = new SystemTime();
- // 设置参数
- nGetSystemTime.setParameter(0, systemTime.getPointer());
- nGetSystemTime.invoke();
- // 解析结构指针内容
- return systemTime.getValueFromPointer();
- }
- public static void main(String[] args) throws NativeException, IllegalAccessException {
- System.err.println(GetSystemTime());
- System.exit(0);
- }
- }
JNA方式调用dll
JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。
首先下载JNA,
代码:
[java] view plain copy
- package com.tvjody;
- import com.sun.jna.Library;
- import com.sun.jna.Native;
- import com.sun.jna.Platform;
- public class JNA {
- // 定义接口CLibrary,继承自com.sun.jna.Library
- public interface testdll extends Library {
- // msvcrt为dll名称,msvcrt目录的位置为:C:\Windows\System32下面,
- testdll Instance = (testdll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
- testdll.class);
- // printf为msvcrt.dll中的一个方法.
- void printf(String format, Object... args);
- }
- public static void main(String[] args) {
- // 调用printf打印信息
- testdll.Instance.printf("yyyyMMdd");
- }
- }
JNI调用dll
如果有一个现有的.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的一大弱点!只提供几个链接吧!
http://blog.sina.com.cn/s/blog_6c3b9ed40100xyl8.html
http://www.open-open.com/home/space-37924-do-blog-id-5681.html
以上源代码下载
Java调用DLL有多种方式,常用的方式有JNative、JNA、JNI等。的更多相关文章
- java调用dll/so文件
大家都知道用C++编写的程序如果用于windows使用则编译为xxx.dll文件,如果是Linux使用则编译为libxxx.so文件.下面将java调用dll/so文件的方法粘出来方便下次使用.此处使 ...
- Java 调用Dll
Java 中怎么能调用到dll中的函数呢? 关键是java中生的本地函数名參数和dll中的本地函数名參数一模一样. 这个程序是java中调用dll中的求和函数. 一,java代码部分操作 1.新建pr ...
- Java调用dll动态库
最近项目里使用java调用dll动态库,因此研究了一下这方面的东西. 使用的工具包如下 <dependency> <groupId>net.java.dev.jna</g ...
- Android-WebView与本地HTML (Java调用--->HTML的方法)-(new WebView(this)方式)
之前的博客,Android-WebView与本地HTML (Java调用--->HTML的方法),是在 findViewById(R.id.webview);,来得到WebView, 此博客使用 ...
- java调用dll或so动态库文件(c++/c)
java调用dll或so动态库文件(c++/c) 博客分类: 工作 CC#C++JavaEclipse java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CD ...
- 在Windows中实现Java调用DLL(转载)
本文提供调用本地 C 代码的 Java 代码示例,包括传递和返回某些常用的数据类型.本地方法包含在特定于平台的可执行文件中.就本文中的示例而言,本地方法包含在 Windows 32 位动态链接库 (D ...
- Java调用.dll文件
因为项目的需求,要在JAVA项目中调用Windows的Dll(动态链接库)文件,之前用Jni调用过C写的Dll文件,比较麻烦,这里不多说,网上也有很多这方面的文档.在网上找到一个开源的组件JNativ ...
- Java 调用 C++ (Java 调用 dll)康哥手把手教你
摘要: 本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4979243.html 因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是 ...
- Java 调用Restful API接口的几种方式--HTTPS
摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful ...
随机推荐
- 系统管理员常用的Linux命令
整理Linux的一些基本系统管理命令作为备忘 ========================================================================= 查看文 ...
- Anaconda完全入门指南
Anaconda完全入门指南 参考文章: 致Python初学者:Anaconda入门使用指南 Anaconda使用总结 概述 很多学习python的初学者甚至学了有一段时间的人接触到anaconda或 ...
- 001.NTP简介
一 NTP简介 ntp服务器顾名思义就是时间同步服务器(Network Time Protocol),时间同步对于计划备份.入侵检测记录.分布式任务调度或者事务订单管理来说都是非常有必要的日常任务. ...
- Python3 决策树ID3算法实现
# -*- coding: utf-8 -*- """ Created on Wed Jan 24 19:01:40 2018 @author: markli 采用信息增 ...
- iOS 一句话获取日期和星期几
UILabel *dateLabel = [[UILabel alloc]initWithFrame:CGRectMake(, , self.view.frame.size.width, )]; da ...
- android 自定义view android onmeasure onlayot ondraw
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha android onmeasure onlayot ondraw 顺序 ====== 1 ...
- 初始化collectionViewCell
#import <UIKit/UIKit.h> @interface TonyCollectionViewCell : UICollectionViewCell @property UII ...
- javascript 正则限制文本输入框只允许输入数字,简单实现。
<input type="text" id="memberId" lay-verify="title" autocomplete=&q ...
- 【原】Redis windows下的环境搭建
下载地址:https://github.com/dmajkic/redis/downloads 下载下来的包里有两个,一个是32位的,一个是64位的.根据自己的实情情况选择,我的是64bit,把这个文 ...
- POP3_收取QQ邮箱邮件的问题
今天纠结了一天的时间,使用pop3协议收取qq邮箱中邮件时,因为一个特别坑爹的问题重新写n次,最后发现是因为qq邮箱设置了独立邮箱密码,必须的用独立邮箱密码登陆才行,/(ㄒoㄒ)/~~!!!! 但今天 ...