Pracuję nad wywoływaniem funkcji z skompilowanego pliku Delphi * .so z programu Java. Po pewnych badaniach wydaje się, że jest on na dobrej drodze. Przed zagłębieniem się w skomplikowany kod Delphi, próbuję grać z jakimś kodem "Hello World", ale mam problemy z uzyskaniem ciągu zwracanego przez funkcję Delphi.Jak mogę wywołać funkcję Delphi, która zwraca ciąg znaków przy użyciu JNA?
Kod Delphi (helloworld.pp):
library HelloWorldLib;
function HelloWorld(const myString: string): string; stdcall;
begin
WriteLn(myString);
Result := myString;
end;
exports HelloWorld;
begin
end.
skompilować go z linii poleceń z "FPC -Mdelphi helloworld.pp", która produkuje libhelloworld.so.
Teraz moja klasa 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"));
}
}
Jednak gdy uruchamiam ten kod Java uzyskać:
# 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
Zauważ, że jeśli mogę zmienić metodę Delphi (i związanego z interfejsu Java), aby powrócić zakodowana liczba całkowita, wszystko działa świetnie: ciąg, który przekazuję, zostaje wydrukowany i otrzymuję int z powrotem zgodnie z oczekiwaniami.
O dziwo, jeśli metoda Delphi zwróci znak, muszę napisać mój serwer proxy JNA jako zwracający bajt i ręcznie wysłać go do char (jeśli deklaruję, że mój interfejs zwraca zwęglę, drukuje znak śmieci).
Masz pomysł, co tu jest nie tak?
FYI, jestem na Ubuntu 12.04, 64 bitów, używając Sun JDK 1.7.0_10-b18, JNA 3.5.1 i darmowego kompilatora Pascal w wersji 2.4.4-3.1.
Czy możesz zwrócić inny 'String's z funkcji natywnej niż ten, który został przekazany? – JimmyB
@HnonoBinder: Otrzymuję ten sam błąd, jeśli zmienię kod Delphi na "Result: =" HELLO ";". :( –