Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2015, 21:34   #11
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

вместо writeln() поставил присвоение переменной:
x:=10;

и в итоге такая же ошибка
-Jack- вне форума Ответить с цитированием
Старый 02.01.2015, 22:08   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Значит с профилем вызова не катит. По-моему в тех ссылках что я дал упоминалось такое.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.01.2015, 23:18   #13
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Там такой ошибки не разбирается ...Жаль, что на Delphi почти ничего нет ... одни примеры на C++

По сути дела, если указывать некорректный путь, то будет появляться соответствующая ошибка

Код:
UnsatisfiedLinkError no MyDelphiLib2.dll in java.library.path
Т.е. это говорит о том, что java подгружает библиотеку, но вот сама библиотека оформлена неверно ...

Последний раз редактировалось Stilet; 03.01.2015 в 22:36.
-Jack- вне форума Ответить с цитированием
Старый 03.01.2015, 22:32   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Попробуй вызови из стандартной user32 какую нить функцию WinAPI. Например MessageBox() таким образом.
Если не ошибаюсь они тоже описаны как stdcall, соответственно если нарвешься на ошибку то дело не в ДЛЛ, а в вызове из самой Явы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.01.2015, 23:04   #15
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Попробуй вызови из стандартной user32 какую нить функцию WinAPI. Например MessageBox() таким образом.
Если не ошибаюсь они тоже описаны как stdcall, соответственно если нарвешься на ошибку то дело не в ДЛЛ, а в вызове из самой Явы.
Погрузить тот же самый MessageBox не удалось, но на 1 из заморских форумов нашел необходимую информацию ...

Всё же оказалась проблема в том, как оформлена DLL, вернее в названии функций.

При вызове функций DLL необходимо писать обвязку для этой библиотеки, т.к. функцию Java_main_HelloJNI_sayHello можно вызвать только из main.HelloJNI

да, и библиотека на С++ и на Delphi заработали !!! Класс, пойду клипать либу дальше )))Stilet, спасибо тебе )))

Последний раз редактировалось -Jack-; 03.01.2015 в 23:07.
-Jack- вне форума Ответить с цитированием
Старый 03.01.2015, 23:04   #16
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Т.е. это говорит о том, что java подгружает библиотеку, но вот сама библиотека оформлена неверно ...
При loadLibrary надо указывать только имя dll, без расширения. В зависимости от ОС, JVM сам допишет нужное расширение. Библиотеку же JVM будет искать в корневой папке Java проекта.
Человек_Борща вне форума Ответить с цитированием
Старый 03.01.2015, 23:12   #17
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Всё же оказалась проблема в том, как оформлена DLL, вернее в названии функций.
Не не не )))
Сам же сказал:
Цитата:
необходимо писать обвязку для этой библиотеки
Стало быть не в ДЛЛ проблема, а в незнании как ее вызвать в Яве )
Иначе бы получилось что все стандартные библы винды оформлены неверно - короче ржака
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.01.2015, 23:23   #18
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Короче - разобрались
-Jack- вне форума Ответить с цитированием
Старый 03.01.2015, 23:47   #19
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Вы какие-то древние мануалы и технологии используете. Через JNA и интерфейсы все отлично работает.

Delphi:
Цитата:
library D4J;

uses
System.SysUtils;

function HelloWorldFromDelphi(x, y: Integer): Integer; stdcall;
begin
Result := x + y;
end;

function GiveNeText: PWideChar; stdcall;
begin
Result := 'РУССКИЙ RUSSIAN ТЕКСТ TEXT';
end;

exports HelloWorldFromDelphi, GiveNeText;

begin

end.
Java 1 - InterfDLL_D4J.java:
Код:
package DelphiCall;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.WString;

public interface InterfDLL_D4J extends Library {

	InterfDLL_D4J INSTANCE = (InterfDLL_D4J) Native.loadLibrary("D4J",
			InterfDLL_D4J.class);

	int HelloWorldFromDelphi(int x, int y);
	WString GiveNeText();

}
Java 2 - Main.java:
Код:
package DelphiCall;

import DelphiCall.*;

public class Main {

	public static void log(String sStr) {
		System.out.println(sStr);
	}

	public static void main(String[] args) {
		InterfDLL_D4J lib = InterfDLL_D4J.INSTANCE;

	    int a = 3;
	    int b = 2;
	    int result = lib.HelloWorldFromDelphi(a,b);
		log("result = " + result);
		log("GiveNeText = "+lib.GiveNeText());
	}
}
Итог out.println'ов в консоле JVM:
Цитата:
result = 5
GiveNeText = РУССКИЙ RUSSIAN ТЕКСТ TEXT
Недостающее в гугле

Последний раз редактировалось Человек_Борща; 04.01.2015 в 00:01.
Человек_Борща вне форума Ответить с цитированием
Старый 04.01.2015, 01:06   #20
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Мне кажется, что у автора темы проблема с именованием экспортируемой функции. Оно должно точно соответствовать соглашением JNI с учетом регистра, для чего стоит задать его явно:
Код:
exports
    Java_HelloWorld_DisplayHelloWorld name 'Java_HelloWorld_displayHelloWorld';
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SendMessageA jni WM_LBUTTONDOWN problem ((( Xsires Общие вопросы по Java, Java SE, Kotlin 12 22.11.2012 01:40
вызов Java метода из c++ (JNI) Евгений643 Qt и кроссплатформенное программирование С/С++ 1 26.12.2011 00:58
Интеграция dll написаной на с++ через jni thereisnosun Qt и кроссплатформенное программирование С/С++ 0 30.04.2011 21:41
JNI вызов java методов из С++ belka_cj Общие вопросы по Java, Java SE, Kotlin 0 24.11.2009 19:36
Технология JNI, не работает пример :( lexluther Общие вопросы по Java, Java SE, Kotlin 0 23.11.2008 02:48