Я работаю над вызовом функций из файла * .so, скомпилированного Delphi, из программы Java. После некоторого исследования кажется, что JNA - это то, что нужно. Прежде чем погрузиться в сложный код Delphi, я пытаюсь поиграть с кодом «Hello World», но у меня возникают проблемы с получением строки, возвращаемой функцией 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 возвращает char, я должен написать свой прокси JNA как возвращающий байт и вручную преобразовать его в char (если я объявляю свой интерфейс как возвращающий char, он распечатывает символ мусора).
Есть идеи, что здесь происходит не так?
К вашему сведению, я использую Ubuntu 12.04, 64 бита, использую Sun JDK 1.7.0_10-b18, JNA 3.5.1 и Free Pascal Compiler версии 2.4.4-3.1.
String
из собственной функции, кроме той, которая была передана? - person JimmyB   schedule 27.12.2012