Как я могу вызвать функцию 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.

Ответы на вопрос(2)

Ваш ответ на вопрос