当前位置: 首页 > 编程日记 > 正文

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

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

 

1Jna简单介绍1

2Jna范例halo owrld1

3Jna概念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接口。

DllC函数的集合、容器,这正和接口的概念吻合。

 

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)
学习JNAJnative个人总结 - 80后的梦想 - ITeye技术网站.htm
(impt)Java JNA 详解 梦想是奢侈品,向奢侈品进军 博客频道 - CSDN.NET.htm
本文原名《使用JNA方便地调用原生函数》发表于20093月的程序员杂志上。
[-]

    介绍
    实现原理
        调用原生函数
            使用JNA调用原生函数
            调用原生函数的模式
    和原生代码的类型映射
        和操作系统数据类型的对应表
        支持常见的数据类型的映射
    模拟结构体
        使用JNA调用使用StructC函数
            说明
        模拟复杂结构体
            结构体内部可以包含结构体对象的数组
            结构体内部可以包含结构体对象的指针的数组
    代码
        通过回调函数实现原生代码调用Java代码
        回调函数说明
    模拟指针
        使用PointerByReference模拟指向指针的指针
        模拟指针
        类详解

 

 

转载于:https://www.cnblogs.com/attilax/p/5963542.html

相关文章:

Android自定义控件系列之基础篇

一、概述在android开发中很多UI控件往往需要进行定制以满足应用的需要或达到更加的效果&#xff0c;接下来就通过一个系列来介绍自定义控件,这里更多是通过一些案例逐步去学习&#xff0c;本系列有一些典型的应用&#xff0c;掌握好了大家也可去创新开发出一些更好的UI&#xf…

用matlab编辑器打开.m文件

1、复制如下代码在&#xff0c;matlab命令行里运行 commandwindow; cwdpwd; cd([matlabroot \toolbox\matlab\winfun\private]); fileassoc(add,{.m,.mat,.fig,.p,.mdl,[. mexext]}); % 重点&#xff0c;增加了多种文件类型 cd(cwd); disp(Changed Windows file associations.…

Unity制作2D动作平台游戏视频教程

Metroidvania工具包:打造统一的2D行动平台 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:8.96 GB |时长:20h 53m 学习用C#编码&#xff0c…

Redis初学:1(NoSQL的简介和Redis的安装)

什么是NoSQL NoSQL数据库意即&#xff1a;Not Only SQL 不仅仅是SQL&#xff0c;它区别于传统的关系型数据库&#xff0c;储存方式按照的是key-value的形式存储数据&#xff0c;这个我们可以联想到我们以前学过的HashMap。 NoSQL的特点&#xff1a; 语法上区别于传统的SQL语句…

函数指针amp;绑定: boost::functoin/std::function/bind

see link&#xff1a; https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow.com/questions/14677997/stdfunction-vs-template boost::functoin/std::function可用于全部 operator() 操作的对象&#xff08;函数&#xff0c;类。成员…

Python编程规范及性能优化

为什么80%的码农都做不了架构师&#xff1f;>>> Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- 。设置编辑器&#xff0c;默认保存为 utf-8 格式。 注释 业界普遍认同 Python 的注释分为两种的概念&#xff0c;一种是由 # 开…

Matlab 快捷键 设置

把Matlab的快捷键都和Windows平台上的保持一致。设置方法&#xff1a;[File]->[Preferences]->[Command Window]->[Keyboard & indenting]->[command line key bindings][File]->[Preferences]->[Editor/Debugger]->[Keyboard & indenting]->[…

Maya与Substance Painter风格化材质阴影和照明学习教程

大小解压后&#xff1a;619 M 1920X1080 mp4 时长&#xff1a;第一部分 48分55秒 第二部分 32分29秒 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 第一部分介绍Substance Painter风格化材质制作 第二部分介绍Maya中灯光及阴影的学习技…

Deep learning的一些教程 (转载)

几个不错的深度学习教程&#xff0c;基本都有视频和演讲稿。附两篇综述文章和一副漫画。还有一些以后补充。 Jeff Dean 2013 Stanford http://i.stanford.edu/infoseminar/dean.pdf 一个对DL能干什么的入门级介绍&#xff0c;主要涉及Google在语音识别、图像处理和自然语言处理…

Redis初学:2(Redis的启动)

Redis有两种启动方式 前台启动&#xff08;不推荐&#xff09; 直接使用命令redis-server&#xff0c;执行结果如下图&#xff1a; 想要退出直接按ctrlc即可 后台启动&#xff08;推荐&#xff09; 先在redis的安装目录下复制redis.conf文件到任意一个文件夹底下然后将red…

iOS开发系列--通知与消息机制

http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态&#xff0c;如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情。iOS中通知机制又叫消息机制&#xff0c;其包括两类&a…

解决Undefined function or method 'vgg_kmiter' for input arguments of type 'double'.

Undefined function or method vgg_kmiter for input arguments of type double. Error in > vgg_kmeans at 32 [CX, sse] vgg_kmiter(X, CX); 解决方法&#xff1a; 由于高matlab版本不再支持mxCreateScalarDouble&#xff0c;而被变为mxCreateDoubleScalar.因而把所…

C#和Unity游戏开发者大师班2021 (2D,3D和FPS)

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |大小:11.1 GB |时长:22h 31m 含项目文件 创建你的第一个Unity游戏-水果忍者克隆&#xff0c;豪斯梅斯特…

Redis初学:4(Redis的常用命令)

Redis的常用命令 查看所有key keys *如下图&#xff1a; 插入key set key value如下图&#xff1a; 取出key对应的value值 get key如下图&#xff1a; 查看某个key是否存在 exists key如下图&#xff1a; 1表存在这个key&#xff0c;0表示不存在 判断某个key是什么…

计算多项式的值

总时间限制: 1000ms内存限制: 65536kB描述对于多项式f(x) ax3 bx2 cx d 和给定的a, b, c, d, x&#xff0c;计算f(x)的值。 输入输入仅一行&#xff0c;包含5个实数&#xff0c;分别是x&#xff0c;及参数a、b、c、d的值&#xff0c;每个数都是绝对值不超过100的双精度浮点…

bash 脚本编程2 条件判断 (笔记)

条件判断类型&#xff1a;整数测试字符测试文件测试条件表达式&#xff1a; [ exppression ] expression test expression 注意一定要加空格前后都要加整数比较&#xff1a; -eq 测试两个整数是否相等&#xff0c;相等为真&#xff0c;不等为假。 equal-ne 测试两个整数是否…

matlab视频保存为图片

将如下代码保存到m文件&#xff0c;不是函数文件&#xff0c;是script文件&#xff0c; matlab 将视频保存为图片 可以根据需要自行修改 [filename,pathname,fileindex]uigetfile(*.avi,请选择一个Avi文件); dnameuigetdir(c:/,保存到); dname[dname \]; video_infoVideoRea…

Blender车辆绑定动画制作视频教程

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:72节课(22小时9m) |大小解压后:22 GB 含课程项目素材 ~在Blender中为动画装配汽车、卡车、轨道和…

Redis初学:5(String类型的基本操作)

String类型 String类型是Redis中最基本的类型&#xff0c;String类型有以下的一些特点&#xff1a; String类型是二进制安全的&#xff0c;这意味着String类型可以包含任何的数据&#xff0c;如&#xff1a;图片、序列化的对象等&#xff1b;Redis中一个String类型的value的大…

【PL/SQL】--导出oracle单表数据--drp204

转载于:https://www.cnblogs.com/wangmei/p/5187660.html

使用模块化编译缩小 apk 体积

libcocos2dlua.so编译出来有11M多&#xff0c;其中包含了很多不需要的模块&#xff0c;模块化编译&#xff0c;把不需要用到的模块弄成0&#xff0c;体积就小了。 如&#xff1a; 修改D:\codeide\sDiShu2formm\frameworks\runtime-src\proj.android\jni\Application.mk为 ifeq …

matlab2013a vs2013 opencv2.4.8 编译TLD

出现如下错误是因为编译方法不对&#xff0c;&#xfeff;&#xfeff;bb_overlap.cpp(36) : error C3861: “min”: 找不到标识符 bb_overlap.cpp(36) : error C3861: “max”: 找不到标识符 bb_overlap.cpp(37) : error C3861: “min”: 找不到标识符 bb_overlap.cpp(3…

UE5和Blender中的完整场景环境创建学习教程

UE5和Blender中的完整环境创建–深入课程 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|时长:80节课(30h 48m) |大小解压后:28 GB 了解专业环境艺术家…

Redis初学:6(List类型)

List类型 List的特点&#xff1a;单键多值 Redis的List是简单的字符串列表&#xff0c;按照插入顺序排序。可以添加一个元素到列表的头部&#xff08;左边&#xff09;或者尾部&#xff08;右边&#xff09;。 它的底层实际是个双向链表&#xff0c;对两段的操作性能很高&…

2.交叉工具链

2.交叉工具链 一、交叉工具链&#xff1a; 交叉工具链&#xff0c;其实他有两个含义&#xff0c;一个就是交叉工具&#xff0c;所谓的交叉工具就是运行的环境和编译的环境不是在一体的。就像我们现在&#xff0c;编译裸机程序是在pc机上面执行的。可我们运行程序是在开发板。…

Windows内存管理和linux内存管理

windows内存管理 windows 内存管理方式主要分为&#xff1a;页式管理&#xff0c;段式管理&#xff0c;段页式管理。 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页&#xff1b;页式管理把内存空间按照页的大小划分成片或者页面&#xff0c;然后把页式虚拟地…

UltraEdit 21激活

无需断网 UE v21.00.0.1033激活UE v21.00.0.1033激活UE v21.00.0.1033激活UE v21.00.0.1033激活UE v21.00.0.1033激活 UE v21.00.0.1056激活UE v21.00.0.1056激活UE v21.00.0.1056激活UE v21.00.0.1056激活UE v21.00.0.1056激活 点击我去下载激活器 如果激活遇到“ultraEdit …

Unity创建使用操纵杆飞行动画教程

Unity 3d移动超级英雄使用操纵杆飞行 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:20节课(5h 16m) |大小解压后:3.37 GB 含 COURSE FOLDER FIL…

Redis初学:7(Set类型)

Set集合类型 简介 Redis里面的Set类型跟Java里面的Set一样&#xff0c;都是带有自动除重的&#xff0c;它里面不会出现重复的数据。 特点&#xff1a;自动除重 底层数据结构 Redis中的Set是一个String类型的无序集合&#xff0c;它的底层其实是一个value值为null的hash表&a…

GitHub上README.md教程

http://blog.csdn.net/kaitiren/article/details/38513715 最近对它的README.md文件颇为感兴趣。便写下这贴&#xff0c;帮助更多的还不会编写README文件的同学们。 README文件后缀名为md。md是markdown的缩写&#xff0c;markdown是一种编辑博客的语言。用惯了可视化的博客编辑…