powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JMF из апплета: попытка повторной загрузки DLL
13 сообщений из 13, страница 1 из 1
JMF из апплета: попытка повторной загрузки DLL
    #38076206
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi All,

На странице апплет, который вызывает JMF для снятия картинки со страницы A, потом отправляет картинку на сервер по HTTP и переадресует браузер на страницу B.

Почему-то при попытке перейти по линку со страницы B на страницу A возникает ошибка при создании плеера:

UnsatisfiedLinkError Native Library jmvfw.dll already loaded in another classloader

Поскольку при переходе на страницу B окно java консоли сразу не закрывается (надо ждать примерно минуту), создается впечатление, что апплет не выгружается. Соответственно, надо как-то заставить апплет выгрузиться либо по завершении снятии картинки как-то принудительно освобождать dll.

Есть идеи?

Картинка снимается так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
		devices = CaptureDeviceManager.getDeviceList(null);
		for (Iterator i = devices.iterator(); i.hasNext();) {
			deviceInfo = (CaptureDeviceInfo) i.next();
			if (deviceInfo.getName().startsWith("vfw:")) {
				System.out.println((new StringBuilder(
						"Capture Device Info>>>>>>>>>>>>>>")).append(
						deviceInfo.getName()).toString());
				break;
			}
		}

		try {
			System.out.println("About to create player...");
			player = Manager.createRealizedPlayer(deviceInfo.getLocator());
			System.out.println("Player created!");
			player.start();
			System.out.println("Player started!");
		} catch (NoPlayerException npe) {
			npe.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (CannotRealizeException e) {
			e.printStackTrace();
		}
		imageWebcamLabel.add(player.getVisualComponent());
		frameGrabber = (FrameGrabbingControl) player
				.getControl("javax.media.control.FrameGrabbingControl");

		Buffer buf = frameGrabber.grabFrame();
		Image img = (new BufferToImage((RGBFormat) buf.getFormat()))
				.createImage(buf);
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076222
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://j-integra.intrinsyc.com/support/kb/Article.aspx?id=122967
Не очень понятно это у вас один апплет, или два разных?
Если это один апплет, то надо подшаманить HTML, чтобы Java Plug-in идентифицировал апплет и запустил его в старом ClassLoader-е.
Если это два разных апплета... Можно ошибку просто поймать и проигнорировать. DLL уже загружена - можно юзать.
Можно JVM насильно потушить, если прав хватит. Тогда Java Plug-in её перезапустит. Но это уже грубо.
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076243
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Это один и тот же апплет, и страница одна и та же.

Как в таком случае подшаманить HTML?
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076251
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АфриканецЭто один и тот же апплет, и страница одна и та же.
Как в таком случае подшаманить HTML?
Там в статье написано - codebase и archive в объявлении апплета должны совпадать с точностью до символа.
http://rsdn.ru/forum/java/1273331.1
Тогда будет один и тот же ClassLoader (хотя это по-моему и не документировано)

И ещё вопрос. Почему бы java.awt.Robot не использовать? Зачем вам JMF только для снятия скриншотов?
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076253
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz http://j-integra.intrinsyc.com/support/kb/Article.aspx?id=122967
Не очень понятно это у вас один апплет, или два разных?
Если это один апплет, то надо подшаманить HTML, чтобы Java Plug-in идентифицировал апплет и запустил его в старом ClassLoader-е.
Если это два разных апплета... Можно ошибку просто поймать и проигнорировать. DLL уже загружена - можно юзать.
Можно JVM насильно потушить, если прав хватит. Тогда Java Plug-in её перезапустит. Но это уже грубо.

Апплет один и тот же, страница одна и та же.

Ошибку можно было бы поймать, если бы библиотека грузилась в моем коде, а не в глубине метода createPlayer(). Я уж его и в singleton люлрачивать пытался - ответ тот же.

А как насильно загасить JVM? Прав хватит.
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076257
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczАфриканецЭто один и тот же апплет, и страница одна и та же.
Как в таком случае подшаманить HTML?
Там в статье написано - codebase и archive в объявлении апплета должны совпадать с точностью до символа.
http://rsdn.ru/forum/java/1273331.1
Тогда будет один и тот же ClassLoader (хотя это по-моему и не документировано)

И ещё вопрос. Почему бы java.awt.Robot не использовать? Зачем вам JMF только для снятия скриншотов?

Страница одна и та же. Но первый вызов работает, а второй - нет. Объявления гарантированно совпадают, т.к. страница та же.

Я, наверное, недостаточно корректно выразился. Картинка с камеры.
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076271
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда странно. classloader_cache в апплете не прописан? Покажите объявление апплета.
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076276
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, и почему бы просто не игнорировать исключение? Ловите UnsatisfiedLinkError , проверяйте если в тексте написано про " already loaded in another classloader", то смело работайте дальше.
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076285
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
<applet code="com.etc.pbs.gk.web.move.ImageCaptureApplet"
	archive="<%=archive%>"
	alt="Applet is NOT loaded! Please contact technical support"
	width="720" height="620">
	<param name="webPictureField" value="webPicture" />
	<param name="urlToSubmit" value="<%=urlToSubmit%>" />
	<param name="urlToRedirect" value="<%=urlToRedirect%>" />
</applet>



Все подставляемые переменные заполняются в одном и том же методе:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
				String archive = request.getRequestURL().substring(
						0,
						request.getRequestURL().length()
								- request.getRequestURI().length())
						+ request.getContextPath() + "/applets/jmf.jar";

				String urlToSubmit = request.getRequestURL().substring(
						0,
						request.getRequestURL().length()
								- request.getRequestURI().length())
						+ request.getContextPath()
						+ "/pages/login/switchTo.do?prefix=/pages/move&page=/imageAppletParamsProcess.do";
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076289
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczНу, и почему бы просто не игнорировать исключение? Ловите UnsatisfiedLinkError , проверяйте если в тексте написано про " already loaded in another classloader", то смело работайте дальше.

Так оно у меня в методе JMF, который возвращает player. Ну перехвачу я его, а player-то будет null.
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076318
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Африканец String archive = request.getRequestURL().substring(
0,
request.getRequestURL().length()
- request.getRequestURI().length())
+ request.getContextPath() + "/applets/jmf.jar";

А зачем такие сложности??? Может поэтому у вас и archive разный, когда одна и та же страница открывается по разным URL.
Сделайте абсолютный путь тогда
"/" + request.getContextPath() + "/applets/jmf.jar";
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38076331
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczАфриканец String archive = request.getRequestURL().substring(
0,
request.getRequestURL().length()
- request.getRequestURI().length())
+ request.getContextPath() + "/applets/jmf.jar";

А зачем такие сложности??? Может поэтому у вас и archive разный, когда одна и та же страница открывается по разным URL.
Сделайте абсолютный путь тогда
"/" + request.getContextPath() + "/applets/jmf.jar";

Спасибо, попробую.
...
Рейтинг: 0 / 0
JMF из апплета: попытка повторной загрузки DLL
    #38077122
Африканец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczАфриканец String archive = request.getRequestURL().substring(
0,
request.getRequestURL().length()
- request.getRequestURI().length())
+ request.getContextPath() + "/applets/jmf.jar";

А зачем такие сложности??? Может поэтому у вас и archive разный, когда одна и та же страница открывается по разным URL.
Сделайте абсолютный путь тогда
"/" + request.getContextPath() + "/applets/jmf.jar";

Это не помогло, но помогло переписывание объявления апплета.

Вы были правы: CODEBASE должен быть, тогда апплет каждый раз грузится одним и тем же лоадером.

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
<applet code="com.etc.pbs.gk.web.move.ImageCaptureApplet"
	codebase="/gk2web/applets"
	archive="jmf.jar"
	alt="Applet is NOT loaded! Please contact technical support"
	width="720" height="620">
	<param name="webPictureField" value="webPicture" />
	<param name="urlToSubmit" value="<%=urlToSubmit%>" />
	<param name="urlToRedirect" value="<%=urlToRedirect%>" />
</applet>
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JMF из апплета: попытка повторной загрузки DLL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]