`
suigara
  • 浏览: 81865 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 使用JNA连接天敏VC4000采集卡

    博客分类:
  • java
 
阅读更多

突然发现自己快成了专门调硬件的了

 

 

废话不多说了,正题开始

使用的库

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,直接运行

 

分享到:
评论
3 楼 flyong86 2014-09-16  
哎~~终于搞对了,原来有个程序占用了视频采集卡

但是调用VCAStartVideoPreview后还是没有图像
2 楼 flyong86 2014-09-16  
在Win7 64位看了这些dll都有,而且运行的时候init正常调用只是没得采集卡等,返回false

在Win XP上在system32里面的确没有发现这些dll
1 楼 flyong86 2014-09-16  
有些郁闷,在Win7 64位系统运行没问题,但是这个机器没安装视频采集卡等
另外一台机器Win XP 32位系统一直提示java.lang.UnsatisfiedLinkError: Unable to load library,一直不识别动态库,看了路径对的,用Dependency Walker看dll依赖,发现缺少IESHIMS.DLL与WER.DLL,下载了这两个dll,又缺少其它的,又下载提示缺少的dll,感觉就是无底洞一样,又提示缺少某某dll

相关推荐

    java 使用JNA连接海康的硬盘录像机

    Java 使用JNA连接海康硬盘录像机的知识点详解 在Java开发中,有时我们需要与操作系统底层的库进行交互,例如控制硬件设备或者调用特定的系统API。Java Native Access(JNA)提供了一种无需编写C/C++桥接代码就能...

    java 使用jna开启关闭第三方应用程序.txt

    java使用jna开启关闭第三方应用程序,附简单的例子,打开一个记事本,朋友们也可以改为自己需要打开的应用程序

    java 使用JNA读取ddl文件

    java 使用JNA读取ddl文件,亲测有效!

    java使用jna连接华视CVR-100UC读卡器

    由于java提供jni有诸多不便,再加上我很菜,c这些东西全还给了老师了,所以还是选用jna调用,代码什么的都放在附件中了,jna的使用其实还是挺简单的,网上有很多相关的示例,但是就是需要注意一些dll文件路径,参数...

    java 使用jna连接kpci-1847(847)等板卡(继电器相关)

    Java 使用 JNA 连接 KPCI-1847(847)等板卡涉及到的是在Java程序中与硬件设备进行通信的技术。JNA(Java Native Access)是Java平台上的一个库,允许Java代码直接调用操作系统级别的API,而无需编写C/C++的桥接代码...

    Java通过JNA调用系统API

    本文将详细介绍如何使用Java通过JNA调用系统API,以Windows系统为例,重点讲解如何调用`Kernel32.dll`中的`GetLocalTime()`, `GetSystemTime()` 和 `SetLocalTime()` 方法。 1. **Java Native Access (JNA)**: JNA...

    java用JNA调用dll实例,包含各种参数调用

    对于引用,JNA会在Java对象和DLL函数之间建立连接,确保改变一方会影响到另一方。 3. **结构体**:JNA提供了一个Struct类,允许你在Java中定义结构体并映射到DLL中的结构体类型。你需要继承Struct类,定义成员变量...

    java_jna包

    在标题中提到的"java_jna包",很可能是包含JNA库的Java项目或库的压缩文件,便于开发者下载和使用。这个包可能包含了JNA的核心库、平台依赖的库文件,以及相关的示例和文档,帮助开发者快速理解和使用JNA。 描述中...

    java通过jna返回结构体例子.rar

    本示例是关于如何在Java中使用JNA处理C语言返回的结构体数据。下面将详细介绍这个过程,以及如何在Linux环境下实现。 首先,我们需要了解JNA的基本概念。JNA是一种纯Java库,允许Java代码直接调用本地库(如C库)的...

    Java JNA使用参考手册.pdf

    ### Java JNA 使用参考手册知识点概述 #### 一、JNA简介 JNA(Java Native Access)是一个基于经典JNI技术的Java开源框架,它允许Java应用程序动态地访问本机库,例如Windows系统的.dll文件,而无需编写任何JNI或...

    JAVA-JNA简单使用

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码与本地操作系统功能进行交互,无需编写C语言的动态链接库(DLL)或JNI(Java Native Interface)代码。JNA通过一种声明式的接口,使Java程序员...

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...

    Java实现获取窗口句柄并操作窗口jna-4.4.0

    为了弥补这个不足,开发人员可以使用Java Native Access (JNA),这是一个Java平台上的库,允许Java代码调用本机库函数,与操作系统进行更直接的交互。 JNA是Java与本机代码之间的一个桥梁,它消除了编写C/C++头文件...

    使用JNA获取窗口句柄,并发送消息

    JNA提供了一种无需编写C代码或使用JNI(Java Native Interface)即可调用操作系统API的方法。本话题将详细介绍如何使用JNA获取窗口句柄并发送消息,以及在CS(Client-Server)架构中实现SSO(Single Sign-On)。 ...

    USB-IC读写器Java_Jna示例源码.rar

    标题 "USB-IC读写器Java_Jna示例源码.rar" 提供的是一个使用Java通过JNA(Java Native Access)技术调用DLL动态库来读写IC卡的示例项目。这个项目主要关注的是在Java环境中实现对IC卡,如MIFARE One卡的读写操作,这...

    通过JNA让Java调用Dll方法

    研究java调用dll的时候,大部分都是通过jni,比较麻烦,我找到了通过jna方法调用dll的方法,用起来比较方便,只需要引用jna.jar包,这个jar包已经包含在程序中,还包含了我调用dll的遇到难道的解决办法。

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    相比之下,JNA(Java Native Access)作为一种更简洁、更易于使用的框架,逐渐成为开发者的首选。 - **JNI** 的调用过程较为复杂,需要编写额外的C/C++代码来作为桥梁,增加了开发成本和维护难度。 - **JNA** 极大...

    jna 现成的java调用jna项目 包括jna.jar

    Java Native Access (JNA) 是一个Java库,它允许Java代码与本地库进行交互,无需编写C语言的JNI(Java Native Interface)代码。这个技术极大地简化了Java应用程序调用操作系统功能或者使用非Java编写的库的过程。在...

    JNA例子包含jna.jar已经java调用JNA的例子

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码无需编写C/C++的JNI(Java Native Interface)代码,即可直接调用本地操作系统API。在本压缩包中,包含了一个JNA的使用示例,以及必要的库文件`...

Global site tag (gtag.js) - Google Analytics