Erro Chato no JMF: "VFW Request Thread" java.lang.UnsatisfiedLinkError: JMFSecurityManager..."

Aeh pessoal, me bati uma semana com um erro num programinha para captura de imagem de webcam com o JMF. Eu estava fazendo tudo certinho e o programa gerava o seguinte erro e não funcionava nem com os exemplos mais simples da Sun. Como não vi reportado por nenhum usuário deste tópico e quebrei muita cabeça até descobrir do que se tratava, estou postando o erro e a solução aqui para que possa servir para alguém no futuro.

O erro é:

:?

[code]Exception in thread “VFW Request Thread” java.lang.UnsatisfiedLinkError: JMFSecurityManager:

java.lang.UnsatisfiedLinkError: no jmvfw in java.library.path
at com.sun.media.JMFSecurityManager.loadLibrary(JMFSecurityManager.java:206)
at com.sun.media.protocol.vfw.VFWCapture.<clinit>(VFWCapture.java:19)
at com.sun.media.protocol.vfw.VFWSourceStream.doConnect(VFWSourceStream.java:241)
at com.sun.media.protocol.vfw.VFWSourceStream.run(VFWSourceStream.java:763)
at java.lang.Thread.run(Thread.java:595)[/code]

:smiley:
A solução encontrada foi:

Copie os arquivos [color=red]“jmvfw.dll”[/color] e [color=red]“jmvcm.dll”[/color] de [color=red]“windows/system32”[/color] para of [color=brown]“C:\Arquivos de programas\Java\jre1.5.0_06\bin”[/color]

:smiley:
O código que utilizei no meu programa para ver imagem e capturar foto e salvar em arquivo foi:

[code]import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.media.Buffer;
import javax.media.CaptureDeviceInfo;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.cdm.CaptureDeviceManager;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class CapturaFoto extends JPanel {

public static Player player = null;
public CaptureDeviceInfo di = null;  //  @jve:decl-index=0:
public MediaLocator ml = null;  //  @jve:decl-index=0:
public JButton capture = null;
public Buffer buf = null;
public Image img = null;
public VideoFormat vf = null;
public BufferToImage btoi = null;
public ImagePanel imgpanel = null;

private static final long serialVersionUID = 1L;
private JButton captura = null;


public CapturaFoto() {
	super();
	initialize();
}


private void initialize() {
	this.setLayout(new BorderLayout());
	this.setSize(327, 259);
	this.add(getCaptura(), BorderLayout.SOUTH);
	this.setVisible(true);
	

	 String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
	 di = CaptureDeviceManager.getDevice(str2);
	// ml =  new MediaLocator("vfw://0");
	 ml = di.getLocator();
	try {

		player = Manager.createRealizedPlayer(ml);
		player.start();
		Component comp;
		if ((comp = player.getVisualComponent()) != null) {
			add(comp, BorderLayout.NORTH);
		}
		add(captura, BorderLayout.SOUTH);
	} catch (Exception e) {
		e.printStackTrace();
	}

}

public void gravaImg (Image imagem){		
	String caminho = "C:\\000000001.JPG";
	try {
		ImageIO.write((RenderedImage) imagem, "jpg", new File(caminho));
		JOptionPane.showMessageDialog(this, "Imagem Capturada!");
	} catch (IOException e) {
		JOptionPane.showMessageDialog(null, "não foi possivel encontrar " +
				"o dispositivo para a captura da imagem.");
		e.printStackTrace();
	}
	
}
private JButton getCaptura() {
	if (captura == null) {
		captura = new JButton("Captura");
		captura.setBounds(50, 50, 50, 50);
		captura.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				FrameGrabbingControl fgc = (FrameGrabbingControl) player
						.getControl("javax.media.control.FrameGrabbingControl");
				buf = fgc.grabFrame();
				btoi = new BufferToImage((VideoFormat) buf.getFormat());
				img = btoi.createImage(buf);
				gravaImg(img);
			}
		});
	}
	return captura;
}

class ImagePanel extends Panel {

	private static final long serialVersionUID = 1L;
	public Image myimg = null;

	public ImagePanel() {
		JOptionPane.showMessageDialog(null, "setando a classe");
		setLayout(null);
		setSize(320, 240);
	}

	public void setImage(Image img) {
		this.myimg = img;
		repaint();
	}

	public void paint(Graphics g) {
		if (myimg != null) {
			g.drawImage(myimg, 0, 0, this);
		}
	}

}

}[/code]

Espero que isto seja útil a alguém!