Atitit.java jna 调用c c++ dll的原理与实践 总结 v2 q27
来源:互联网 发布:表达无网络的图片大全 编辑:程序博客网 时间:2024/06/06 13:57
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语言中映射Java的数据类型。
JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射,你不再需要编写C动态链接库。
2. Jna范例halo owrld
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
/** Simple example of JNA interface mapping and usage. */
public class HelloWorld {
// This is the standard, stable way of mapping, which supports extensive
// customization and mapping of Java to native types.
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)
Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
CLibrary.class);
void printf(String format, Object... args);
}
public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
for (int i=0;i < args.length;i++) {
CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
}
}
}
指定c类库dll路径 msvcrt,没有采用全路径,会自动搜索系统路径下面的。
C:\Windows\winsxs\amd64_microsoft-windows-msvcrt_31bf3856ad364e35_6.1.7600.16385_none_2d4a27c7b8972454\msvcrt.dll
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
3. Jna概念
JNA把一个dll/.so文件看做是一个Java接口。
Dll是C函数的集合、容器,这正和接口的概念吻合。
3.1. (1)需要定义一个接口,继承自Library 或StdCallLibrary
默认的是继承Library ,如果动态链接库里的函数是以stdcall方式输出的,那么就继承StdCallLibrary,比如众所周知的kernel32库。比如上例中的接口定义:
?
1
2
3
public interface CLibrary extends Library {
}
3.2. 2)接口内部定义
接口内部需要一个公共静态常量:INSTANCE,通过这个常量,就可以获得这个接口的实例,从而使用接口的方法,也就是调用外部dll/so的函数。
该常量通过Native.loadLibrary()这个API函数获得,该函数有2个参数:
· 第一个参数是动态链接库dll/so的名称,但不带.dll或.so这样的后缀,这符合JNI的规范,因为带了后缀名就不可以跨操作系统平台了。搜索动态链接库路径的顺序是:先从当前类的当前文件夹找,如果没有找到,再在工程当前文件夹下面找win32/win64文件夹,找到后搜索对应的dll 文件,如果找不到再到WINDOWS下面去搜索,再找不到就会抛异常了。比如上例中printf函数在Windows平台下所在的dll库名称是 msvcrt,而在其它平台如Linux下的so库名称是c。
· 第二个参数是本接口的Class类型。JNA通过这个Class类型,根据指定的.dll/.so文件,动态创建接口的实例。该实例由JNA通过反射自动生成。
接口中只需要定义你要用到的函数或者公共变量,不需要的可以不定义,如上例只定义printf函数:
4. 数据类型映射 NA官方给出的默认类型映射表如下:
参见参考
5. JNA能完全替代JNI吗?
这可能是大家比较关心的问题,但是遗憾的是,JNA是不能完全替代JNI的,因为有些需求还是必须求助于JNI。
使用JNI技术,不仅可以实现Java访问C函数,也可以实现C语言调用Java代码。
而JNA只能实现Java访问C函数,作为一个Java框架,自然不能实现C语言调用Java代码。此时,你还是需要使用JNI技术。
JNI是JNA的基础,是Java和C互操作的技术基础。有时候,你必须回归到基础上来。
6. 参考
Atitit.java jna 调用c++ dll 的总结
使用JNA访问Java外部函数接口 - OPEN 开发经验库.htm
paip.java 调用c++ dll so总结 - attilax的专栏 - 博客频道 - CSDN.NET.htm
参考
Java调用.dll文件 - 抹去浮华,沉淀深度 - ITeye技术网站.htm (jnative)
学习JNA,Jnative个人总结 - 80后的梦想 - ITeye技术网站.htm
(impt)Java JNA 详解 - 梦想是奢侈品,向奢侈品进军 - 博客频道 - CSDN.NET.htm
本文原名《使用JNA方便地调用原生函数》发表于2009年3月的“程序员”杂志上。
[-]
介绍
实现原理
调用原生函数
使用JNA调用原生函数
调用原生函数的模式
和原生代码的类型映射
和操作系统数据类型的对应表
支持常见的数据类型的映射
模拟结构体
使用JNA调用使用Struct的C函数
说明
模拟复杂结构体
结构体内部可以包含结构体对象的数组
结构体内部可以包含结构体对象的指针的数组
代码
通过回调函数实现原生代码调用Java代码
回调函数说明
模拟指针
使用PointerByReference模拟指向指针的指针
模拟指针
类详解
- Atitit.java jna 调用c c++ dll的原理与实践 总结 v2 q27
- Atitit.java jna 调用c++ dll 的总结
- atitit.js 与c# java交互html5化的原理与总结.doc
- atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97
- Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
- Atitit.java相比c#.net的优点 优缺点 v2 q330
- Atitit.异常的设计原理与 策略处理 java 最佳实践 p93
- Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27
- Atitit 图像处理--图像分类 模式识别 肤色检测识别原理 与attilax的实践总结
- atitit..代码生成流程图 流程图绘制解决方案 java c#.net php v2
- atitit.md5算法的原理 与 总结
- Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别
- Atitit.数据库存储引擎的原理与attilax 总结
- Atitit.upnp SSDP 查找nas的原理与实现java php c#.net c++
- Atitit. 。Jna技术与 解决 java.lang.Error: Invalid memory access
- atitit.木马病毒webshell的原理and设计 java c# .net php.
- Atitit.视频文件加密的方法大的总结 java c# php
- Atitit 项目语言的选择 java c#.net php??
- 敏捷测试(三)从一个实例详解敏捷测试的最佳实践
- Atitit.虚拟机与指令系统的设计
- Runtime_实现计算一个Button被点击次数
- 基于Android arm64 Linux got 调试
- AssetDatabase文档翻译
- Atitit.java jna 调用c c++ dll的原理与实践 总结 v2 q27
- java web学习(进阶篇)五 Spring中的事件
- Java 基础总结--this关键字
- 深入理解Java虚拟机----(一)走近java
- 深入理解Java虚拟机----(二)内存区域与内存溢出异常
- UVA 10047 - The Monocycle(BFS)
- Atitit .jvm 虚拟机指令详细解释
- java中“==”和equal()的区别以及equal()的重载
- activiti学习笔记(1)