Tôi đang làm việc trên các chức năng gọi từ tệp Delphi được biên dịch * .so từ một chương trình Java. Sau khi một số nghiên cứu nó có vẻ như JNA là ông cách để đi. Trước khi đi sâu vào một số mã Delphi phức tạp, tôi đang cố gắng chơi với một số mã "Hello World" nhưng gặp sự cố khi nhận được một chuỗi được trả về bởi hàm Delphi.Làm thế nào tôi có thể gọi một hàm Delphi trả về một chuỗi bằng cách sử dụng JNA?
Mã Delphi (helloworld.pp):
library HelloWorldLib;
function HelloWorld(const myString: string): string; stdcall;
begin
WriteLn(myString);
Result := myString;
end;
exports HelloWorld;
begin
end.
tôi biên dịch nó từ dòng lệnh với "FPC -Mdelphi helloworld.pp", trong đó sản xuất libhelloworld.so.
Bây giờ lớp Java của tôi:
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"));
}
}
Tuy nhiên khi tôi chạy mã Java này tôi nhận được:
# 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
Lưu ý rằng nếu tôi thay đổi phương pháp Delphi của tôi (và giao diện Java liên quan) để trở về một số nguyên hardcoded, tất cả mọi thứ hoạt động tuyệt vời: chuỗi tôi vượt qua được in và tôi nhận được int trở lại như mong đợi.
Thật kỳ lạ, nếu phương thức Delphi trả về một char, tôi phải viết proxy JNA của tôi khi trả về một byte và chuyển nó thành char thủ công (nếu tôi khai báo giao diện của mình khi trả về char nó sẽ in ra một ký tự rác).
Có ý tưởng gì xảy ra ở đây không?
FYI, tôi đang sử dụng Ubuntu 12.04, 64 bit, sử dụng Sun JDK 1.7.0_10-b18, JNA 3.5.1 và Phiên bản trình biên dịch Pascal miễn phí 2.4.4-3.1.
Bạn có thể trả về 'Chuỗi' khác từ hàm gốc hơn hàm đã được chuyển vào không? – JimmyB
@HannoBinder: Tôi nhận được cùng một lỗi nếu tôi thay đổi mã Delphi của tôi để làm "Kết quả: = 'HELLO';". :( –