突然发现自己快成了专门调硬件的了
废话不多说了,正题开始
使用的库
1.官方的两个dll(Mix.dll,Sa7134Capture.dll),可能对应不同版本,我这是6.0的,附件里有
2.jna的jar包,注意是两个
jna.jar,jna-platform.jar
以上都在本文后面提供下载
关键代码
首先是jna的代理,不明白的看下jna怎么用,这里定义dll存在的且你需要的函数就可以了
package xingyang.meam.video; import java.io.File; import com.sun.jna.Native; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.win32.StdCallLibrary; /** * * 视频显示设备 * * @author Administrator * */ public interface CaptureDevice extends StdCallLibrary { File f = new File(""); CaptureDevice INSTANCE = (CaptureDevice) Native.loadLibrary( f.getAbsolutePath() + "\\Sa7134Capture", CaptureDevice.class); /** * 该函数用于初始化开发包。在使用SDK开发包中的函数前,首先需要调用该函数进行初始化。 * * @param hwnd * 表示视频显示多路小窗口的父窗口。 * @param eDispTransType * 表示显示类型。 * @param bLnitAuDev * 表示是否初始化音频设备。 * @return */ public boolean VCAInitSdk(HWND hwnd); /** * 该函数用于释放调用VCAInitSdk函数分配的系统资源,通常在程序结束时调用该函数。 */ public void VCAUnInitSdk(); /** * 该函数用于获得监控卡中芯片的数量。通常,监控卡支持多少路视频,将会存在多少个芯片。 * * @return 表示系统中安装监控卡上的芯片数量。 */ public int VCAGetDevNum(); /** * 该函数用于打开指定卡号的设备,并分配相应的系统资源。 * * @param dwCard * 表示视频捕捉的卡号。 * @param hPreviewWnd * 表示视频预览窗口句柄。 * @return */ public boolean VCAOpenDevice(int dwCard, HWND hPreviewWnd); /** * 该函数用于关闭指定卡号的设备,释放相应系统资源。 * * @param dwCard * 表示视频捕捉的卡号。 * @return */ public boolean VCACloseDevice(int dwCard); /** * 该函数用于打开视频预览窗口。 * * @param dwCard * 表示预览的视频卡号。 * @return */ public boolean VCAStartVideoPreview(int dwCard); /** * 该函数用于停止视频预览。 * * @param dwCard * 表示预览的视频卡号。 * @return */ public boolean VCAStopVideoPreview(int dwCard); /** * 该函数用于更新视频预览窗口。当预览窗口的父窗口大小或位置改变时,需要调用该函数进行调整。 * * @param hOverlayWnd * 表示预览窗口的父窗口。 * @return */ public boolean VCAUpdateOverlayWnd(HWND hOverlayWnd); /** * 该函数用于更新视频预览窗口。当预览窗口的大小和位置需要调整时调用该函数。通常,在调用该函数前,需要调用VCAUpdateOverlayWnd函数。 * * @param dwCard * 表示预览的视频卡号。 * @param hPreviewWnd * 表示视频预览窗口。 * @return */ public boolean VCAUpdateVideoPreview(int dwCard, HWND hPreviewWnd); }
主类
package xingyang.meam.video; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Panel; import java.io.IOException; import java.util.Properties; import javax.swing.JFrame; import com.sun.jna.Native; import com.sun.jna.platform.win32.WinDef.HWND; public class VideoMain { public static void main(String[] args) { Properties p = new Properties(); try { p.load(VideoMain.class.getResourceAsStream("/config.properties")); } catch (IOException e) { e.printStackTrace(); } String[] cardNos = p.getProperty("cardNumbers", "0,1,2,3").trim() .split(","); // int type = Integer.parseInt(p.getProperty("type")); JFrame jf = new JFrame(); Panel parent = new Panel(); parent.setPreferredSize(new Dimension(660, 500)); jf.add(parent); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); parent.setLayout(new FlowLayout()); Panel panels[] = new Panel[cardNos.length]; for (int i = 0; i < panels.length; i++) { Panel cardPanel = new Panel(); cardPanel.setPreferredSize(new Dimension(320, 240)); cardPanel.setBackground(new Color(255, 0, 255)); parent.add(cardPanel); panels[i] = cardPanel; } jf.pack(); jf.setVisible(true); boolean success = CaptureDevice.INSTANCE .VCAInitSdk(createHWNDByComponent(parent)); if (!success) { System.out.println("init = " + success); } for (int i = 0; i < panels.length; i++) { Panel cardPanel = panels[i]; HWND hwnd = createHWNDByComponent(cardPanel); int cardNo = Integer.parseInt(cardNos[i]); System.out.println("cardNo = " + cardNo); boolean isopen = CaptureDevice.INSTANCE.VCAOpenDevice(cardNo, hwnd); if (!isopen) { System.out.println("isopen = " + isopen); } boolean isstart = CaptureDevice.INSTANCE .VCAStartVideoPreview(cardNo); if (!isstart) { System.out.println("isstart = " + isstart); } // CaptureDevice.INSTANCE // .VCAUpdateOverlayWnd(createHWNDByComponent(parent)); // CaptureDevice.INSTANCE.VCAUpdateVideoPreview(cardNo, hwnd); } // CaptureDevice.INSTANCE // .VCAUpdateOverlayWnd(createHWNDByComponent(parent)); } private static HWND createHWNDByComponent(Component parent) { return new HWND(Native.getComponentPointer(parent)); } }
这里有个变态的是,就是小panel(显示视频的panel)的背景色不能随便设,得设成粉色(255,0,255)才行,否则。。明明返回的都是true,就是不显示画面。。
还有个注意的地方,Native.getComponentPointer的参数得是重量级的不能用轻量级的
也就是awt的,别用swing的
其他就没啥了
发现jna果然是个神器。。。。,否则写JNI。。。想想都头疼
附件是java工程,导入eclipse,直接运行
相关推荐
Java 使用JNA连接海康硬盘录像机的知识点详解 在Java开发中,有时我们需要与操作系统底层的库进行交互,例如控制硬件设备或者调用特定的系统API。Java Native Access(JNA)提供了一种无需编写C/C++桥接代码就能...
java使用jna开启关闭第三方应用程序,附简单的例子,打开一个记事本,朋友们也可以改为自己需要打开的应用程序
java 使用JNA读取ddl文件,亲测有效!
由于java提供jni有诸多不便,再加上我很菜,c这些东西全还给了老师了,所以还是选用jna调用,代码什么的都放在附件中了,jna的使用其实还是挺简单的,网上有很多相关的示例,但是就是需要注意一些dll文件路径,参数...
Java 使用 JNA 连接 KPCI-1847(847)等板卡涉及到的是在Java程序中与硬件设备进行通信的技术。JNA(Java Native Access)是Java平台上的一个库,允许Java代码直接调用操作系统级别的API,而无需编写C/C++的桥接代码...
本文将详细介绍如何使用Java通过JNA调用系统API,以Windows系统为例,重点讲解如何调用`Kernel32.dll`中的`GetLocalTime()`, `GetSystemTime()` 和 `SetLocalTime()` 方法。 1. **Java Native Access (JNA)**: JNA...
对于引用,JNA会在Java对象和DLL函数之间建立连接,确保改变一方会影响到另一方。 3. **结构体**:JNA提供了一个Struct类,允许你在Java中定义结构体并映射到DLL中的结构体类型。你需要继承Struct类,定义成员变量...
在标题中提到的"java_jna包",很可能是包含JNA库的Java项目或库的压缩文件,便于开发者下载和使用。这个包可能包含了JNA的核心库、平台依赖的库文件,以及相关的示例和文档,帮助开发者快速理解和使用JNA。 描述中...
本示例是关于如何在Java中使用JNA处理C语言返回的结构体数据。下面将详细介绍这个过程,以及如何在Linux环境下实现。 首先,我们需要了解JNA的基本概念。JNA是一种纯Java库,允许Java代码直接调用本地库(如C库)的...
### Java JNA 使用参考手册知识点概述 #### 一、JNA简介 JNA(Java Native Access)是一个基于经典JNI技术的Java开源框架,它允许Java应用程序动态地访问本机库,例如Windows系统的.dll文件,而无需编写任何JNI或...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码与本地操作系统功能进行交互,无需编写C语言的动态链接库(DLL)或JNI(Java Native Interface)代码。JNA通过一种声明式的接口,使Java程序员...
Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...
为了弥补这个不足,开发人员可以使用Java Native Access (JNA),这是一个Java平台上的库,允许Java代码调用本机库函数,与操作系统进行更直接的交互。 JNA是Java与本机代码之间的一个桥梁,它消除了编写C/C++头文件...
JNA提供了一种无需编写C代码或使用JNI(Java Native Interface)即可调用操作系统API的方法。本话题将详细介绍如何使用JNA获取窗口句柄并发送消息,以及在CS(Client-Server)架构中实现SSO(Single Sign-On)。 ...
标题 "USB-IC读写器Java_Jna示例源码.rar" 提供的是一个使用Java通过JNA(Java Native Access)技术调用DLL动态库来读写IC卡的示例项目。这个项目主要关注的是在Java环境中实现对IC卡,如MIFARE One卡的读写操作,这...
研究java调用dll的时候,大部分都是通过jni,比较麻烦,我找到了通过jna方法调用dll的方法,用起来比较方便,只需要引用jna.jar包,这个jar包已经包含在程序中,还包含了我调用dll的遇到难道的解决办法。
相比之下,JNA(Java Native Access)作为一种更简洁、更易于使用的框架,逐渐成为开发者的首选。 - **JNI** 的调用过程较为复杂,需要编写额外的C/C++代码来作为桥梁,增加了开发成本和维护难度。 - **JNA** 极大...
Java Native Access (JNA) 是一个Java库,它允许Java代码与本地库进行交互,无需编写C语言的JNI(Java Native Interface)代码。这个技术极大地简化了Java应用程序调用操作系统功能或者使用非Java编写的库的过程。在...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码无需编写C/C++的JNI(Java Native Interface)代码,即可直接调用本地操作系统API。在本压缩包中,包含了一个JNA的使用示例,以及必要的库文件`...