मैं सी में एक समारोह जो मैं JNA साथ जावा से कॉल करने के लिए कोशिश कर रहा हूँ के साथ पैरामीटर पासिंग:एक जावा वर्ग एक शून्य में * JNA
int myCfunc(void *s, int *ls);
JNA documentation के अनुसार शून्य * एक com.sun.jna.Pointer
हो की आवश्यकता है समारोह में पारित किया गया। JNA के साथ जावा में मुझे विश्वास है ऊपर समारोह के रूप में निम्नानुसार लिपटे किया जाएगा:
public interface myWrapper extends Library{
public int myCfunc(Pointer s, IntByReference ls);
}
जैसे वस्तुओं जो करने के लिए सूचक से जुड़ा हुआ है, और पैरामीटर s
में पारित वर्ग है जो JNA संरचना को लागू किया जाएगा की जरूरत है,
public class myClass extends Structure{
public int x;
public int y;
public int z;
}
दुर्भाग्यवश, पैरामीटर ls
बाइट्स में कक्षा की लंबाई का प्रतिनिधित्व करने वाला एक पूर्णांक है। जावा में sizeof
फ़ंक्शन नहीं है, इसलिए यह जटिलता का एक अतिरिक्त बिट जोड़ता है। मेरी दूसरी बड़ी समस्या यह सुनिश्चित कर रही है कि मैं ऑब्जेक्ट की सामग्री को मूल स्मृति और पीछे से सही ढंग से पास कर रहा हूं।
मेरी कोड निम्न के समान है:
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.ptr.IntByReference;
public void foo(){
myWrapper wrapper = (myWrapper) Native.loadLibrary("SomeDllWithLegacyCode", myWrapper.class);
myClass myObj = new myClass();
myObj.x = 1;
myObj.y = 2;
Pointer myPointer = myObj.getPointer();
int size = Native.getNativeSize(myClass.class);
IntByReference len = new IntByReference(size);
myObj.write(); //is this required to write the values in myObj into the native memory??
wrapper.myCfunc(myPointer, len);
myObj.read(); //does this read in the native memory and push the values into myObj??
myPointer.clear(size); //is this required to clear the memory and release the Pointer to the GC??
}
मैं एक त्रुटि कि डेटा पारित कर दिया हो रही है की तुलना में होने की उम्मीद है सी समारोह से एक बड़े आकार का है।
उपर्युक्त कोड लगभग उसी तरह के चरणों का पालन करने के लिए as provided out in this answer एक ही मुद्दे से निपटने वाले प्रश्न के लिए, लेकिन सी # में। मैंने कोशिश की और परीक्षण किया है कि यह सी # में काम करता है।
मेरा प्रश्न another on Stackoverflow के समान है, लेकिन यह एक क्लाइंट के पॉइंटर की बजाय इंटिबीरेंसेंस के पॉइंटर से संबंधित है।