JNA and libffi

JNA make it easy to call native code from Java. For a given function defined in 

JNA way. JNA first gets the handle to the function from native shared library.  

Then it uses libffi to call the function.

 

libffi make it possible to call native function dynamically.

 

#include <stdio.h>
#include <ffi.h>
#include <dlfcn.h>

int main()
{
  ffi_cif cif;
  ffi_type *args[1];
  void *values[1];
  char *s;
  int rc;
  void *handle;
  void *func;
  char *error;

  /* open a handle to the library */
  handle = dlopen("/lib/libc.so.6", RTLD_LAZY);
  if (!handle) {
    fprintf(stderr, "dlopen error: %s\n", dlerror());
    return 1;
  }

  /* open a handle to puts function */
  func = dlsym(handle, "puts");
  if ((error = dlerror()) != NULL) {
    fprintf(stderr, "dlsym error: %s\n",  error);
    return 1;
  }

  /* Initialize the argument info vectors */
  args[0] = &ffi_type_pointer;
  values[0] = &s;

  /* Initialize the cif */
  if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
        &ffi_type_uint, args) == FFI_OK) {
    s = "Hello World!";
    ffi_call(&cif, func, &rc, values);
    s = "This is cool!";
    ffi_call(&cif, func, &rc, values);
  }

  dlclose(handle);
  return 0;
}
 

你可能感兴趣的:(JNA)