- 浏览: 270184 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
wen866595:
cywhoyi 写道wen866595 写道cywhoyi 写 ...
mybatis 批量插入插件 -
cywhoyi:
wen866595 写道cywhoyi 写道我觉得是否考虑数据 ...
mybatis 批量插入插件 -
wen866595:
cywhoyi 写道我觉得是否考虑数据路由,你这样方式治标不治 ...
mybatis 批量插入插件 -
cywhoyi:
我觉得是否考虑数据路由,你这样方式治标不治本
mybatis 批量插入插件 -
wy75792:
不错不错
oracle 存储过程 基础
使用JNA简单调用DLL里的函数
1、在VC下创建一个动态链接库项目testJNA
2、在头文件里声明函数
红色字体部分是必须的,包括定义结构体时也需要。应该是说此函数是发布的。
3、在源码里实现函数
4、生成dll文件
5、定义一个表示链接库的接口
接口TestJnaLib继承自com.sun.jna.Library,此接口有一个实例
6、定义对应dll里的方法
7、调用本地方法
Jna回调Java方法:
1、在C语言部分定义带回调函数的函数
红色加粗部分是函数指针。
2、Java部分定义一个回调接口
必须继承自com.sun.jna.Callback接口
Invoke方法里的参数顺序与C函数的对应
3、定义回调接口的实现
4、在表示链接库实现的接口里定义要回调的本地函数
5、调用带函数指针的本地函数
JNA相关知识:
使用JNA调用原生函数的模式:
JNA不实用native关键字。
JNI使用native关键字,使用一个个java方法来代表外部的原生函数。
JNA使用一个java接口来代表一个动态链接库发布的所有函数。
对于不需要的原生函数,可以不在java接口中声明java方法原型。
使用JNI,需要使用System.loadLibrary方法,把专门为JNI编写的动态链接库载入进来,这个动态链接库实际上是真正需要的动态链接库的代理。
使用JNA类库的Native类的loadLibrary方法,是直接把需要的动态链接库载入进来。使用JNA不需要编写作为代理的动态链接库,不需要编写一行原生代码。
跨平台、跨语言调用原则:
尽量使用基本、简单的数据类型;
尽量少跨平台、跨语言传递数据!
Java调用原生函数时,会把数据固定在内存中,这样原生函数才可以访问这些Java数据。这些数据,JVM的GC不能管理,会造成内存碎片。
C语言的结构体是一个严格的规范,定义了内存的次序。因此,JNA中模拟的结构体的变量顺序绝对不能错。
Java调用动态链接库中的C函数,实际上就是把一段内存作为函数的参数传递给C函数。动态链接库以为这个参数就是C语言传过来的参数。
Structure类的write()方法会把结构体的所有字段固定住,是原生函数可以访问。
JNI技术是双向的,既可以从Java代码中调用原生函数,也可以从原生函数中直接创建Java虚拟机,并调用Java代码。
原生函数可以通过函数指针实现函数回调,调用外部函数来执行任务。这就是策略模式。
Callback:
任务回调定义必须继承自com.sun.jna.Callback接口,子类必须定义单个公有方法或一个名为callback的公有方法。必须持有到回调对象的一个存活引用。一个回调应该不抛出异常。
com.sun.jna.Library:
代表本地链接库的定义。可用如下形式定义:
虽然结构体和结构体字段的名字可以是任意的,但他们应该尽可能接近本地定义。参数名也一样。
此接口支持在Java端多线程、并发调用本地方法。如果本地类库不是线程安全的,可用
链接库的搜索路径:
jna.library.path 用户定义的路径;
Jna.platform.library.path 平台定义的路径,
com.sun.jna.Structure:
代表本地结构体的对等Java类。
当作为参数或返回值使用时,这个类被传递给struct * (指针);当作为另一个结构体的字段时,它被传递给struct (值传递)。
标记接口Structure.ByReference和Structure.ByValue被用来提醒默认的行为。
Structure属性传递给本地字段必须是public的。可以由下面可选的修饰符:
volatile JNA不会修改字段,除非被要求,通过writeField(String);
final JNA会通过read()覆写字段,字段在java这边是不可变的。
Structure属性的顺序与类型必须与本地结构体的字段一一对应。
欢迎关注我的微信公众号: coderbee笔记。
首先我也不懂VC,没法直接给出你需要的东西。
不过,看你的问题,你是需要在Java应用与其他应用之间传递数据的话,可以考虑 java.awt.Toolkit.getSystemClipboard() 方法,可以获得一个剪贴板,在Java应用于系统剪贴板之间传递数据。
1、在VC下创建一个动态链接库项目testJNA
2、在头文件里声明函数
extern "C" _declspec(dllexport) int add(int first, int second);
红色字体部分是必须的,包括定义结构体时也需要。应该是说此函数是发布的。
3、在源码里实现函数
int add(int first, int second) { printf("(c) test jna : %d + %d = %d", first, second, first + second); return first + second; }
4、生成dll文件
5、定义一个表示链接库的接口
接口TestJnaLib继承自com.sun.jna.Library,此接口有一个实例
TestJnaLib INSTANCE = (TestJnaLib)Native.loadLibrary("testJNA.dll", TestJnaLib.class);此实例由jna通过反射自动生成。
6、定义对应dll里的方法
int add(int first, int second);
7、调用本地方法
TestJnaLib.INSTANCE.add(3, 5);
Jna回调Java方法:
1、在C语言部分定义带回调函数的函数
extern "C" _declspec(dllexport) void methodWithCallback(int (*fp)(int left, int right), int left, int right);
红色加粗部分是函数指针。
2、Java部分定义一个回调接口
必须继承自com.sun.jna.Callback接口
public interface FunCallBack extends Callback { int invoke(int left, int right); }
Invoke方法里的参数顺序与C函数的对应
3、定义回调接口的实现
public class CallbackFunImpl implements FunCallBack { @Override public int invoke(int left, int right) { System.out.printf("in java :%d + %d = %d\n", left, right, left + right); return left + right; } }
4、在表示链接库实现的接口里定义要回调的本地函数
void methodWithCallback(Callback callback, int left, int right);本地函数的函数指针用Callback 接口替代。
5、调用带函数指针的本地函数
TestJnaLib.INSTANCE.methodWithCallback(new CallbackFunImpl(), 4, 6)
JNA相关知识:
使用JNA调用原生函数的模式:
JNA不实用native关键字。
JNI使用native关键字,使用一个个java方法来代表外部的原生函数。
JNA使用一个java接口来代表一个动态链接库发布的所有函数。
对于不需要的原生函数,可以不在java接口中声明java方法原型。
使用JNI,需要使用System.loadLibrary方法,把专门为JNI编写的动态链接库载入进来,这个动态链接库实际上是真正需要的动态链接库的代理。
使用JNA类库的Native类的loadLibrary方法,是直接把需要的动态链接库载入进来。使用JNA不需要编写作为代理的动态链接库,不需要编写一行原生代码。
跨平台、跨语言调用原则:
尽量使用基本、简单的数据类型;
尽量少跨平台、跨语言传递数据!
Java调用原生函数时,会把数据固定在内存中,这样原生函数才可以访问这些Java数据。这些数据,JVM的GC不能管理,会造成内存碎片。
C语言的结构体是一个严格的规范,定义了内存的次序。因此,JNA中模拟的结构体的变量顺序绝对不能错。
Java调用动态链接库中的C函数,实际上就是把一段内存作为函数的参数传递给C函数。动态链接库以为这个参数就是C语言传过来的参数。
Structure类的write()方法会把结构体的所有字段固定住,是原生函数可以访问。
JNI技术是双向的,既可以从Java代码中调用原生函数,也可以从原生函数中直接创建Java虚拟机,并调用Java代码。
原生函数可以通过函数指针实现函数回调,调用外部函数来执行任务。这就是策略模式。
Callback:
任务回调定义必须继承自com.sun.jna.Callback接口,子类必须定义单个公有方法或一个名为callback的公有方法。必须持有到回调对象的一个存活引用。一个回调应该不抛出异常。
com.sun.jna.Library:
代表本地链接库的定义。可用如下形式定义:
MyNativeLibrary INSTANCE = (MyNativeLibrary)Native.loadLibrary("mylib", MyNativeLibrary.class);
虽然结构体和结构体字段的名字可以是任意的,但他们应该尽可能接近本地定义。参数名也一样。
此接口支持在Java端多线程、并发调用本地方法。如果本地类库不是线程安全的,可用
Native.synchronizedLibrary(com.sun.jna.Library)来阻止多线程同时访问本地代码。
链接库的搜索路径:
jna.library.path 用户定义的路径;
Jna.platform.library.path 平台定义的路径,
com.sun.jna.Structure:
代表本地结构体的对等Java类。
当作为参数或返回值使用时,这个类被传递给struct * (指针);当作为另一个结构体的字段时,它被传递给struct (值传递)。
标记接口Structure.ByReference和Structure.ByValue被用来提醒默认的行为。
Structure属性传递给本地字段必须是public的。可以由下面可选的修饰符:
volatile JNA不会修改字段,除非被要求,通过writeField(String);
final JNA会通过read()覆写字段,字段在java这边是不可变的。
Structure属性的顺序与类型必须与本地结构体的字段一一对应。
欢迎关注我的微信公众号: coderbee笔记。

评论
3 楼
kawin_zhao
2013-12-19
多个dll该怎么引用?
2 楼
wen866595
2013-07-04
grhappygr 写道
大神你好,您能给我一个JNI 的实现在windows任意位置光标所在处实现CTRL+V的方法吗?本人搞JAVA的实在不会写VC之类的,求帮助,谢谢了
首先我也不懂VC,没法直接给出你需要的东西。
不过,看你的问题,你是需要在Java应用与其他应用之间传递数据的话,可以考虑 java.awt.Toolkit.getSystemClipboard() 方法,可以获得一个剪贴板,在Java应用于系统剪贴板之间传递数据。
1 楼
grhappygr
2013-07-03
大神你好,您能给我一个JNI 的实现在windows任意位置光标所在处实现CTRL+V的方法吗?本人搞JAVA的实在不会写VC之类的,求帮助,谢谢了
发表评论
-
mybatis 批量插入插件
2015-08-03 20:40 4100背景 项目中有个设计不合理的表,总共 8 个字段,有 ... -
Java8 Striped64 和 LongAdder
2014-05-18 16:41 2252原文链接:码蜂笔 ... -
内存关卡/栅栏 ( Memory Barriers / Fences ) – 译
2013-12-23 20:37 2105原文地址:http://coderbee.net/i ... -
Java 内存模型 JMM
2013-12-23 20:33 1660原文地址:http://c ... -
False Sharing 伪共享 – 译
2013-11-20 22:59 1186原文地址:http://code ... -
JUC 原子类
2013-11-20 22:57 1318原文地址: http://coderbee.net/i ... -
JVM 垃圾回收算法
2013-11-01 09:32 1216原文: http://coderbee.net/i ... -
java.util.HashMap 源码解读及其进化
2013-10-18 16:47 1719原文: http://coderbee. ... -
JVM 运行时数据区
2013-10-17 22:59 1566原文地址: http://c ... -
Java 8 之 java.time 包
2013-10-15 16:33 16015原文:http://coderbee.net/inde ... -
J.U.C 包
2013-09-27 17:37 1208原文在:http://code ... -
Java 8 新特性之 接口改进和Lambdas
2013-09-14 16:44 3958本文首先发表在 码蜂笔记:http://coderbe ... -
struts2 漏洞 和 缓存攻击
2013-07-19 21:37 2188本文首先发表在我的独立博客站点: 码蜂笔记 ... -
非递归、固定量额外存储空间 遍历二叉树
2013-06-18 22:23 2287原文发表于: http://cod ... -
rsync 核心算法的Java实现
2012-11-17 21:44 5015rsync 算法 场景:假设有两台计算机 CA和 ... -
Java program idiom之 容器
2012-07-04 10:57 1359Java常用的集合类型有 List 、 Set 、 ... -
Java program idiom之 数组
2012-07-03 20:15 1078数组是一种效率最高的存储和随机访问对象引用序列的方式,数组有固 ... -
java program idiom之 资源初始化与清理
2012-07-02 16:39 1192源的初始化与关闭是非常常见的操作,也是很容易出错的地方。Jav ... -
Java program idiom 之 String
2012-06-28 21:33 11761.1. String API String对象是不 ... -
致力于提高Java初级程序员技能的一个努力
2012-06-19 20:58 1267工作近3年,完全从零开始开发的项目较少,基本上都是接手别人的项 ...
相关推荐
在"JNA示例的C++代码"中,我们可以看到以下几个关键概念: 1. **C++编程**:这是一种通用的、面向对象的编程语言,广泛用于系统编程和开发本地库。在这个项目中,C++被用来编写DLL(动态链接库),这是一个可供其他...
JNA 示例 的 java工程, 包含了 结构体指针、回调、char* 映射、byte[]映射等等。
JNA、JNI, Java两种不同调用DLL、SO动态库方式读写ISO15693协议的NXP ICODE标签,支持Windows系统、支持龙芯Mips、LoongArch、海思麒麟鲲鹏飞腾Arm、海光兆芯x86_Amd64等架构平台的国产统信、麒麟等Linux系统编译...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的本地库函数,而无需编写任何C...通过理解JNA的工作机制和实践这个超简单的示例,你将能够更好地理解和应用JNA在你的项目中。
Java通过Jna调用Dll原生库读取RFID卡号,内含jna-4.5.0包,函数说明:https://blog.csdn.net/zhangjin7422/article/details/119574860
"MYJNA.zip"提供的JNA示例项目为学习和理解Java如何通过JNA与C/C++库交互提供了宝贵资源。通过研究这些示例,开发者可以学习到如何定义接口,加载本地库,以及如何处理跨平台的本地函数调用。这个项目对于任何需要在...
例如,下面是一个简单的JNA示例,调用C标准库中的`printf`函数: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; public class HelloWorld { public interface C...
本示例将详细讲解如何利用JNA来调用DLL动态链接库。 首先,我们需要理解JNA的工作原理。JNA的核心在于它的"Interface Mapping",即接口映射。开发者定义一个Java接口,这个接口中的方法对应于本地库中的函数。JNA会...
内部包含6个文件,其中五个是最新JNA jar包,包括jna-platform-4.1.0.jar、jna-platform-4.2.0.jar、jna-platform-4.2.1.jar、jna-platform-4.2.2.jar,一个是JNA介绍文档,包括在线帮助、入门示例、简单程序示例等...
java后端springBoot框架使用jna调取C语言的dll接口(停车场道闸接口) 包含构造体的调用, 回调函数的调用,JNA和C / C ++的数据类型映射,Pointer类型的使用
4. **KPCI_test_jna示例** - **KPCI_test_jna**可能是一个包含测试代码的Java文件,用于验证与KPCI-1847板卡的通信。它可能包括初始化设备、设置继电器、读取输入状态等功能的测试。 - **调试与优化**:在实际应用...
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与...
4. **文档更新**:可能提供了更详尽的文档和示例,帮助开发者更好地理解和使用JNA。 在实际开发中,选择哪个版本取决于项目需求和兼容性。如果你的项目依赖于特定的JNA特性,或者需要最新的性能优化,那么使用4.5.0...
"jna" 指的是Java Native Access,而 "jna-example" 暗示了这个话题将涉及JNA的使用示例,这对于初学者或者需要深入理解JNA功能的人来说非常有价值。 **文件列表解析:** 压缩包中唯一的文件 `jna-3.0.9.jar` 应该...
一个简单的JNA示例是调用Windows API的`GetLocalTime()`函数,该函数用于获取本地计算机的当前日期和时间。不同于`GetSystemTime()`返回协调世界时间(UTC),`GetLocalTime()`返回的是基于用户所在时区的时间。要使用...
在这个“JNA调用DLL简单示例”中,我们将探讨如何使用JNA来调用DLL中的函数。首先,我们需要了解DLL是什么。DLL(Dynamic Link Library)是Windows操作系统中的一种共享库,它包含可由多个程序同时使用的函数和资源...
"jna-demo.zip_DEMO_JNA demo_java jna_jna的demo_vertical6t2"是一个包含JNA使用示例的压缩包,主要用于演示如何在Java程序中调用DLL(动态链接库)文件。 在Java中,由于其跨平台性,通常不直接操作底层系统资源...
本示例将详细介绍如何使用JNA在Java程序中调用C/C++库。 首先,理解JNA的基本工作原理。JNA的核心是`com.sun.jna.Library`接口,这个接口定义了调用本地方法的规范。你需要创建一个类实现这个接口,并声明你想要...
源码可能包括JNA库本身、示例、文档以及其他辅助工具。通过研究源码,开发者可以更好地理解JNA如何处理内存管理、类型转换和错误处理,从而在使用时更加得心应手。 JNA的工作原理是通过动态加载动态链接库(DLL on ...