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模拟指向指针的指针
        模拟指针
        类详解

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

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

  1. java 调用c 的dll,java如何调用C的dll

    java怎么调用C的dll 我做了1个java调用c++的dll 想做一个java调用C的dll就不知道怎么做了 在xx.c里 写 JNIEXPORT jint JNICALL Java_testdl ...

  2. java 项目加载dll文件,Java动态调用链接库dll文件

    Java动态调用链接库dll文件 Java动态调用链接库dll文件 因为项目需要,用到了java调用dll文件中的方法.写成dll文件大多是用C语言弄成的,对于我这个纯粹干java的人员来说,着实让我 ...

  3. 【开发者笔记】java 利用jna调用c#的dll

    一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...

  4. Java利用JNA调用C#的dll

    https://www.cnblogs.com/wyongbo/p/jnaTest.html 本文参考以上链接,结合自己实际遇到的问题,做过一些修改(红色字体标注),主要是为了给自己做个笔记. 一.需 ...

  5. JAVA在IDEA中用JNA调用C++的dll动态链接库案例

    目录 引言 准备工作 1.JNA包 2.DLL文件 接口准备 接口参数说明 1.DLL路径 [报错]找不到文件 如何查看DLL文件的位数? 2.函数声明 如何查看DLL文件中有哪些函数? C++与JA ...

  6. java调用c写的dll jna_Java | 通过JNA调用c语言dll

    java 之前发在我的CSDN博客中,现在搬到简书上来. Java可以通过JNI/JNA调用本地其他语言生成的库文件.以调用c语言为例,可以将c的函数导出dll,java通过JNI/JNA来调用. 本 ...

  7. java jna调用dll文件_关于java jna调用dll的问题

    public interface User32 extends StdCallLibrary { User32 INSTANCE = (User32)Native.loadLibrary(" ...

  8. Java JNA (二)—— dll回调函数实现

    java调用dll文件需要使用回调函数作为公开函数的参数时,用以下方法实现: 首先,看c++中定义的dll公开函数: typedef void (*ccback)(char *name ,int le ...

  9. java SpringBoot调用海康威视的dll去完成摄像头抓拍,以及打包部署问题

    先说开发: 直接将他的64位包中的依赖放到项目根路径里面,然后将他java demo中的HCNetSDK.java复制到自己项目中.自己去他官网下载,或者用我的分享链接下载: https://down ...

最新文章

  1. [JS]请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。
  2. 钉钉被小学生逼疯,拍片在线求饶哈哈哈哈
  3. 卷积:kernel size/padding/stride
  4. 自然语言处理综述(一)
  5. K3删除物料时提示“物料在存货表-物料中....”
  6. 在 Android 中使用 OpenGL
  7. Spark加载外部配置文件
  8. ASP网站精品源码集合(免积分下载)
  9. 新建sublime 的python代码文件时自动在头部增加几行常用代码
  10. SAP CRM WebClient UI Home page里Workflow task retrieve logic
  11. 转载——开阔自己的视野,勇敢的接触新知识
  12. php类的举例,用类来代替递归方法,用php举例_php _ 搞代码
  13. 3.业务架构·应用架构·数据架构实战 --- 战略驱动的业务架构设计
  14. PAIP.手机sms短信,联系人的同步与备份.txt
  15. php 字库,矢量字库的剪裁_php
  16. Java程序员必备的一些流程图/架构图(拿走不谢)
  17. 用python 制作视频播放器
  18. 「 LaTex 」使用多级标题
  19. android 8.0 ps 命令,全网最全adb命令 - osc_8exjk9uk的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. 一个优秀的国产ITSM软件应该有哪些特性?

热门文章

  1. 淘宝获取单笔订单信息服务端调用API及流程
  2. 伍六七带你学算法 入门篇-拼写单词
  3. 2021-2027年中国中高端女装行业市场分析预测及投资方向研究报告
  4. 2022-2028年中国汽车用胶管行业市场深度分析及投资前景趋势报告
  5. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)
  6. centos 安装 node12以及yarn
  7. SpringBoot2.x 不反回空值属性
  8. 分享2020 几个好用的ip地址归属地查询
  9. log4j屏蔽掉某个包下的log日志打印
  10. Maven Eclipse Run as 命令