A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from http://java-native-access.github.io/jna/5.17.0/javadoc/com/sun/jna/InvocationMapper.html below:

InvocationMapper (JNA API)

public interface InvocationMapper

Provide a method for overriding how a given function is invoked. An instance of this interface may be provided to

Native.load(String, Class, java.util.Map)

as an entry in the options map with key

Library.OPTION_INVOCATION_MAPPER

.

This is useful for implementing inlined functions, or functions which are actually C preprocessor macros. Given a native library and JNA interface method, the mapper may provide a handler which implements the desired functionality (which may or may not actually make use of a native method).

For example, the GNU C library remaps the stat function into a call to _xstat with a slight rearrangement of arguments. A mapper for the GNU C library might look like the following:


 new InvocationMapper() {
     public InvocationHandler getInvocationHandler(NativeLibrary lib, Method m) {
         if (m.getName().equals("stat")) {
             final Function f = lib.getFunction("_xstat");
             return new InvocationHandler() {
                 public Object invoke(Object proxy, Method method, Object[] args) {
                     Object[] newArgs = new Object[args.length+1];
                     System.arraycopy(args, 0, newArgs, 1, args.length);
                     newArgs[0] = Integer.valueOf(3); // _xstat version
                     return f.invoke(newArgs);
                 }
             };
         }
         return null;
     }
 }
 

Another situation is where a header provides a function-like macro or inline function definition.


 // Original C code (macro and inline variations)
 #define allocblock(x) malloc(x * 1024)
 static inline void* allocblock(size_t x) { return malloc(x * 1024); }

 // Invocation mapping
 new InvocationMapper() {
     public InvocationHandler getInvocationHandler(NativeLibrary lib, Method m) {
         if (m.getName().equals("allocblock")) {
             final Function f = lib.getFunction("malloc");
             return new InvocationHandler() {
                 public Object invoke(Object proxy, Method method, Object[] args) {
                     args[0] = ((Integer)args[0]).intValue() * 1024;
                     return f.invoke(newArgs);
                 }
             };
         }
         return null;
     }
 }
 
Autor:
twall

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4