Как я могу вызвать функцию Delphi, которая возвращает строку, используя JNA?
Я работаю над вызовом функций из скомпилированного в Delphi файла * .so из Java-программы. После некоторого исследования кажетсяЮНА он путь? Прежде чем погрузиться в сложный код Delphi, япытаюсь поиграть с некоторымиПривет, мир" код, но у меня проблемы с получением строки, возвращаемой функцией Delphi.
Код Delphi (helloworld.pp):
library HelloWorldLib;
function HelloWorld(const myString: string): string; stdcall;
begin
WriteLn(myString);
Result := myString;
end;
exports HelloWorld;
begin
end.
Я компилирую это из командной строки с помощьюfpc -Mdelphi helloworld.pp ", который производитlibhelloworld.so.
Теперь мой класс Java:
import com.sun.jna.Library;
import com.sun.jna.Native;
public class HelloWorld {
public interface HelloWorldLibrary extends Library {
HelloWorldLibrary INSTANCE = (HelloWorldLibrary) Native.loadLibrary("/full/path/to/libhelloworld.so", HelloWorldLibrary.class);
String HelloWorld(String test);
}
public static void main(String[] args) {
System.out.println(HelloWorldLibrary.INSTANCE.HelloWorld("QWERTYUIOP"));
}
}
Однако когда я запускаю этот код Java, я получаю:
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f810318add2, pid=4088, tid=140192489072384
#
# JRE version: 7.0_10-b18
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.6-b04 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [libhelloworld.so+0xbdd2] HelloWorld+0x6fea
Обратите внимание, что если я изменю свой метод Delphi (и связанный Java-интерфейс), чтобы он возвращал жестко запрограммированное целое число, все работает отлично: переданная мне строка печатается, и я возвращаю int как положено.
Как ни странно, если метод Delphi возвращает символ, я должен написать свой прокси-сервер JNA как возвращающий байт и привести его к типу char вручную (если я объявлю свой интерфейс как возвращающий символ, он выведет символ мусора).
Есть идеи, что здесь происходит?
К вашему сведениюm на Ubuntu 12.04, 64 бит, используя Sun JDK 1.7.0_10-b18, JNA 3.5.1 и Free Pascal Compiler версии 2.4.4-3.1.