Package jnr.ffi

Class ObjectReferenceManager<T>

java.lang.Object
jnr.ffi.ObjectReferenceManager<T>
Direct Known Subclasses:
DefaultObjectReferenceManager

public abstract class ObjectReferenceManager<T> extends Object
Provides a mapping between java objects and unique native addresses.

The native addresses generated by this class do not relate to the object's true native address (since that is not supported by most java virtual machines), but is guaranteed to be unique within an ObjectReferenceManager instance.

This would be commonly used to create a unique native pointer that can be used to retrieve an object from within a callback. e.g.

       

       public interface MyLib {
         public static interface MyCallback {
           @Delegate public void call(Pointer value);
         }

         public void do_something_with_callback(MyCallback cb, Pointer cb_argument);
       }

       MyLib lib = LibraryLoader.create(MyLib.class).load("mylib");
       final ObjectReferenceManager referenceManager = Runtime.getRuntime(lib).newObjectReferenceManager();

       MyCallback cb = new MyCallback {
         public void call(Pointer cb_argument) {
           Object javaCallbackArgument = referenceManager.get(cb_argument);
           System.out.println("java callback parameter=" + javaCallbackArgument);
         }
       }

       String callbackArgument = "Hello, World";
       Pointer cb_argument = referenceManager.add(callback);
       lib.do_something_with_callback(cb, cb_argument);
       referenceManager.remove(cb_argument);

       
     
Note

Each call to add(Object) will return a unique native address, even for the same object, so each call to add(Object) must be matched with a call to remove(Pointer).

  • Constructor Details

    • ObjectReferenceManager

      public ObjectReferenceManager()
  • Method Details

    • newInstance

      public static <T> ObjectReferenceManager<T> newInstance(Runtime runtime)
    • newReference

      @Deprecated public Pointer newReference(T object)
      Deprecated.
      Adds a mapping from a java object to a unique native address. Each call to this method is guaranteed to produce a memory address unique within the ObjectReferenceManager instance, even for the same object.

      A strong reference to object is maintained internally, until remove(Pointer) is called.

      Parameters:
      object - The java object to generate a reference for
      Returns:
      A pointer representing the unique id.
    • freeReference

      @Deprecated public void freeReference(Pointer reference)
      Deprecated.
      Removes a mapping from java object to native pointer.
      Parameters:
      reference - a native memory pointer.
    • getObject

      @Deprecated public T getObject(Pointer reference)
      Deprecated.
      Gets the java object that is mapped to the native memory address referred to by reference.
      Parameters:
      reference - a native memory pointer.
      Returns:
      The java object corresponding to pointer.
    • add

      public abstract Pointer add(T object)
      Adds a mapping from a java object to a unique native address. Each call to this method is guaranteed to produce a memory address unique within the ObjectReferenceManager instance, even for the same object.

      A strong reference to object is maintained internally, until remove(Pointer) is called.

      Parameters:
      object - The java object to generate a reference for
      Returns:
      A pointer representing the unique id.
    • remove

      public abstract boolean remove(Pointer reference)
      Removes a mapping from java object to native pointer.
      Parameters:
      reference - a native memory pointer.
      Returns:
      true if the mapping was removed.
    • get

      public abstract T get(Pointer reference)
      Gets the java object that is mapped to the native memory address referred to by reference.
      Parameters:
      reference - a native memory pointer.
      Returns:
      The java object corresponding to pointer.