java - डीएनएल फ़ंक्शन का नाम बदलकर एसटीडी क्लासफंक्शन मैपपर




dll jna (3)

मैं विंडोज में डीएलएल के साथ जेएनए का उपयोग करने की कोशिश कर रहा हूं, अब तक मैं सफलतापूर्वक c_aa_find_devices() नामक फ़ंक्शन को कॉल करने में सक्षम था। लेकिन सभी कार्य c_aa शुरू c_aa और मैं इसे find_devices() नाम से बदलना चाहता find_devices()

ऐसा करने के लिए मैं StdCallFunctionMapper साथ StdCallFunctionMapper कर रहा StdCallFunctionMapper लेकिन मुझे इसका उदाहरण कैसे मिल सकता है, इसका दस्तावेज नहीं मिल रहा है (अर्थात कैसे लिपटे गए जावा लाइब्रेरी में एक नाम से या वांछित नाम से ऑर्डिनल द्वारा डीएलएल फंक्शन को मैप करने के लिए। इंटरफेस)। डॉक्स क्या हैं पर कोई सुझाव?


दस्तावेज़ीकरण से आपको मूल कॉल में loadLibrary में फ़ंक्शनमैपर प्रदान करने की आवश्यकता होती है, जो नाम बदलती है। हालांकि आपको मानक कॉल मैपिंग को रखने की भी आवश्यकता है ताकि निम्न की तरह कुछ प्रयास करें:

Map options = new HashMap();

options.
    put(
        Library.OPTION_FUNCTION_MAPPER, 
        new StdCallFunctionWrapper() {
            public String getFunctionName(NativeLibrary library, Method method) {
                if (method.getName().equals("findDevices") 
                    method.setName("c_aa_find_devices");
                // do any others
                return super.getFunctionName(library, method);
            }
        }
    );

Native.loadLibrary(..., ..., options);

StdCallMapper का उपयोग करना अच्छा नहीं होगा - यह वरीद खिड़कियां स्टेडडी लिपि नामों को चिह्नित करने के लिए माना जाता है जो नाम के भाग के रूप में एम्बेडेड मापदंडों के कुल बाइट लंबाई को एम्बेड करते हैं। चूंकि यह केवल एसडीडी लिब के लिए किया जाता है (बस उस पर अनुमान लगाना है, लेकिन 99% you'r फ़ंक्शन नहीं हैं)।

यदि आपका डीएलएल सभी फ़ंक्शंस पर कुछ सामान्य उपसर्ग का उपयोग करता है, तो आप की तरह कुछ का उपयोग करने की आवश्यकता होती है:

class Mapper implements FunctionMapper{
    public String getFunctionName(NativeLibrary library, Method method) {
       return GenieConnector.FUNCTION_PREFIX + method.getName();
    }
}

जहां GenieConnector.FUNCTION_PREFIXGenieConnector.FUNCTION_PREFIX वह सामान्य उपसर्ग है ध्यान रखें कि मैं StdCallMapper लागू FunctionMapper हूं, नहीं StdCallMapper विस्तार


फ़ंक्शन मैपर का उपयोग करके, एक पूर्ण काम उदाहरण।

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import com.sun.jna.win32.StdCallFunctionMapper;

import java.io.File;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class JnaTest {


    static {
    Map options = new HashMap();
        options.
                put(
                        Library.OPTION_FUNCTION_MAPPER,
                        new StdCallFunctionMapper() {
                            HashMap<String, String> map = new HashMap() {
                                {
                                    put("testMethod", "[email protected]");
                                }
                            };
                            @Override
                            public String getFunctionName(NativeLibrary library, Method method) {
                                String methodName = method.getName();
                                return map.get(methodName);

                            }
                        }
                );

        File LIB_FILE = new File("test.dll");
        Native.register(NativeLibrary.getInstance(LIB_FILE.getAbsolutePath(), options));

    }

    private static native int testMethod();

    public static void main(String[] args) {
        testMethod(); // call the native method in the loaded dll with the function name [email protected]
    }


}