JNA调用库文件
最近项目中要集成厂商的卡口摄像头,需要通过jna调用库函数接收卡口相机抓拍的过车数据。本文记录了Java调用C语言动态库(jna)的调用方式、回调函数、结构体等。
JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架,主要解决jni调用其他语言繁琐的步骤。JNI是Java Native Interface的缩写,它提供了若干的api实现了Java和其他语言的通信(主要是c&c++).
jna 官方github:https://github.com/java-native-access/jna
下面来看看GettingStarted:
/**
* GettingStarted
* @author monkjavaer
* @date 2018/8/28 15:39
*/
public class HelloWorld { /**
* 需要定义一个接口,继承自Library 或StdCallLibrary
* 默认的是继承Library ,如果动态链接库里的函数是以stdcall方式输出的,那么就继承StdCallLibrary
*/
public interface CLibrary extends Library {
/**
* 实例化接口,从而使用接口的方法,也就是调用外部dll/so的函数。
*
* 第一个参数是动态链接库dll/so的名称,但不带.dll或.so这样的后缀,这符合JNI的规范,因为带了后缀名就不可以跨操作系统平台了。
* 搜索动态链 接库路径的顺序是:先从当前类的当前文件夹找,如果没有找到,再在工程当前文件夹下面找win32/win64文件夹,
* 找到后搜索对应的dll文件,如果 找不到再到WINDOWS下面去搜索,再找不到就会抛异常了。
* 比如上例中printf函数在Windows平台下所在的dll库名称是msvcrt,而在 其它平台如Linux下的so库名称是c。
*
* 第二个参数是本接口的Class类型。JNA通过这个Class类型,根据指定的.dll/.so文件,
* 动态创建接口的实例。该实例由JNA通过反射自动生成。
*/
CLibrary INSTANCE = (CLibrary)Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),CLibrary.class); /**
* 参数和返回值的类型,应该和链接库中的函数类型保持一致。
* @param format
* @param args
*/
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]);
}
}
}
jna调用的方式上面代码中的注释已经写得很清楚了,现在我们就来看看jna的函数调用、回调函数。
我们先来看看一般回调函数java的实现,其中加入了异步的思想,这也正是回调方法Callback最大的优势:
现在有一个场景,学生A、B是同学,学生A有到题不会做就ask学生B。
1.会做题的接口
/**
* 回调方法的优势
* 回调方法最大的优势在于,异步回调
*/
public interface Slover {
void slove();
}
2.学生B
/**
* @author monkjavaer
* @date 2018/8/30 15:58
*/
public class StudentB implements Slover{ @Override
public void slove() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("问题解决了");
} }
3.学生A
/**
* @author monkjavaer
* @date 2018/8/30 15:57
*/
public class StudentA{
public void ask(Slover slover) {
new Thread(new Runnable() {
@Override
public void run() {
slover.slove();
}
}).start();
goSomeThing();
}
public void goSomeThing(){
System.out.println("StudentB,我去做其他事了");
}
}
测试
public class Test {
public static void main(String[] args) {
StudentA studentA = new StudentA();
studentA.ask(new StudentB());
}
}
输出:
StudentB,我去做其他事了
问题解决了
在JNA中回调方法要继承Callback或者StdCallCallback
下面这部分参考自:https://blog.csdn.net/ggmove/article/details/17377117
列如dll接口函数及回调函数类型:
typedef void (*Callback_Status)(char *station_id, char *station_ip, int status);
int Start_Server(char *ip, int port, Callback_Status fun);
java代码->回调函数声明:
public class getSDK {
public interface Callback_Status extends StdCallCallback {
public void Status(String station_id, String station_ip, int status);
}
}
java代码->回调函数实现:
public class getSDK {
public static class Status_Realize implements Callback_Status{
public void Status(String station_id, String station_ip, int status) {
if (status == 2) {
GUI.Station_online(station_id, station_ip, 1, 0);
} else if (status == 3) {
GUI.Station_online(station_id, station_ip, 2, 0);
}
}
}
}
JNA调用库文件的更多相关文章
- java 调用 库文件错误查找方法
第一步首先找到 backtrace:keyword,然后找到都应的库文件 出错的地方 pc 0000088b /system/lib/libNDK_04.so (SayHello+98). 08-1 ...
- Linux系统上java调用C++ so库文件
PART1: java中使用jna替代jni调用c++/c生成的 dll/so库文件需要做的事项 1.引入JNA依赖或者直接下载JNAjar包 <!-- http ...
- golang调用c++的dll库文件
最近使用golang调用c++的dll库文件,简单了解了一下,特作此笔记:一.DLL 的编制与具体的编程语言及编译器无关 dll分com的dll和动态dll,Com组件dll:不管是何种语言写的都可以 ...
- swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者
Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...
- Keil C 里面Lib库文件的生成与调用
源:Keil C 里面Lib库文件的生成与调用
- LINUX下C语言编程调用函数、链接头文件以及库文件
LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...
- Linux下JNA 调用 so 库
原文:https://blog.csdn.net/withiter/article/details/8077470 博文链接:https://i.cnblogs.com/EditPosts.aspx? ...
- java调用dll或so动态库文件(c++/c)
java调用dll或so动态库文件(c++/c) 博客分类: 工作 CC#C++JavaEclipse java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CD ...
- g++ 生成C++ .so库文件,并调用示例
Tags: g++ C++ so library 在Linux系统下用g++命令编译C++程序.也可以生成so,a链接库 示例一 编译时链接so库 Test.h 文件内容 Main.cpp ...
随机推荐
- ASP.Net 知识点总结(三)
1.描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是.可以用任意类型. 2.<%# %> 和 <% %> 有什么区别? 答:<%# %>表示绑定 ...
- Hdu 4738 Caocao's Bridges (连通图+桥)
题目链接: Hdu 4738 Caocao's Bridges 题目描述: 有n个岛屿,m个桥,问是否可以去掉一个花费最小的桥,使得岛屿边的不连通? 解题思路: 去掉一个边使得岛屿不连通,那么去掉的这 ...
- 297 Serialize and Deserialize Binary Tree 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据.请设计一个算法来实现二叉树 ...
- scala学习笔记1: scala method
刚接触scala,做练习的时候碰到一个问题,顺便mark一下. 先看下面一段代码: def sum(args:Int*) = { var result = 0 for (arg <- args) ...
- 学习笔记 第五章 使用CSS美化网页文本
第五章 使用CSS美化网页文本 学习重点 定义字体类型.大小.颜色等字体样式: 设计文本样式,如对齐.行高.间距等: 能够灵活设计美观.实用的网页正文版式. 5.1 字体样式 5.1.1 定义字体 ...
- Java易忘知识点统计
缺少 内容 替代措施 幂运算 借助Math类的pow方法 注意 内容 备注 const Java保留关键字,未使用 其他 强制类型转换时,若要舍入得到最接近的整数,可以使用Math.round方法 J ...
- SpringMVC中Controller类的方法返回String不跳转,而是将字符串显示到页面
问题描述: 在spring中,控制层的注解一般都是使用@Controller,如果哪个请求参数需要返回数据的话,我们可以在该方法上配合@ResponseBody注解使用,这也是比较常见的方式了. 今天 ...
- oracle 手动配置服务器端和客户端
1.oracle 服务器端配置 将oracle安装完成之后,在Net Configuration Assistant配置 1.监听程序配置 先找到Net Configuration Assistant ...
- DNN结构构建:NAS网络结构搜索和强化学习、迁移学习
前言 谷歌推出的NASNet架构,用于大规模图像分类和识别.NASNet架构特点是由两个AutoML设计的Layer组成--Normal Layer and Reduction Layer,这样的效果 ...
- 扩增子分析QIIME2-2数据导入Importing data
# 激活工作环境 source activate qiime2-2017.8 # 建立工作目录 mkdir -p qiime2-importing-tutorial cd qiime2-importi ...