मैं जावा प्रोग्राम से डेल्फी संकलित * .so फ़ाइल से फ़ंक्शंस कॉल करने पर काम कर रहा हूं। कुछ शोध के बाद ऐसा लगता है कि JNA वह जाने का रास्ता है। कुछ जटिल डेल्फी कोड में डाइविंग से पहले, मैं कुछ "हैलो वर्ल्ड" कोड के साथ खेलने की कोशिश कर रहा हूं लेकिन मुझे डेल्फी फ़ंक्शन द्वारा लौटाई गई स्ट्रिंग प्राप्त करने में समस्या हो रही है।मैं डेल्फी फ़ंक्शन को कैसे कॉल कर सकता हूं जो जेएनए का उपयोग करके स्ट्रिंग देता है?
डेल्फी कोड (helloworld.pp):
library HelloWorldLib;
function HelloWorld(const myString: string): string; stdcall;
begin
WriteLn(myString);
Result := myString;
end;
exports HelloWorld;
begin
end.
मैं "पांचवें वेतन आयोग -Mdelphi helloworld.pp" के साथ कमांड लाइन है, जो libhelloworld.so का उत्पादन से यह संकलन।
अब मेरी जावा वर्ग:
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"));
}
}
लेकिन जब मैं इस जावा कोड चलाने मैं:
# 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
ध्यान दें कि अगर मैं अपने डेल्फी विधि (और संबद्ध जावा इंटरफेस) बदलने के वापस जाने के लिए एक हार्डकोडेड पूर्णांक, सबकुछ बढ़िया काम करता है: जिस स्ट्रिंग को पास किया जाता है वह मुद्रित हो जाता है और मुझे उम्मीद के अनुसार int वापस मिल जाता है।
आश्चर्यजनक रूप से पर्याप्त है, अगर डेल्फी विधि एक char लौटाती है, तो मुझे एक बाइट लौटने के रूप में अपनी जेएनए प्रॉक्सी लिखनी है और इसे मैन्युअल रूप से चार में डालना है (अगर मैं एक चार्ट लौटने के रूप में अपना इंटरफेस घोषित करता हूं तो यह एक कचरा चरित्र प्रिंट करता है)।
कोई विचार क्या गलत हो रहा है?
एफवाईआई, मैं सूर्य जेडीके 1.7.0_10-बी 18, जेएनए 3.5.1 और फ्री पास्कल कंपाइलर संस्करण 2.4.4-3.1 का उपयोग करते हुए उबंटू 12.04, 64 बिट्स पर हूं।
क्या आप पारित किए गए मूल कार्य से अन्य 'स्ट्रिंग' वापस कर सकते हैं? – JimmyB
@ हनो बाइंडर: अगर मैं अपना परिणाम डेल्फी कोड बदलता हूं तो मुझे एक ही त्रुटि मिलती है "परिणाम: = 'हैलो';"। :( –