|
SWIG/Examples/java/funcptr/
Pointers to Functions
$Header: /cvs/projects/SWIG/Examples/java/funcptr/Attic/index.html,v 1.1.2.1 2002/07/28 20:31:32 cheetah Exp $
Okay, just what in the heck does SWIG do with a declaration like this?
int do_op(int a, int b, int (*op)(int, int));
Well, it creates a wrapper as usual. Of course, that does raise some
questions about the third argument (the pointer to a function).
In this case, SWIG will wrap the function pointer as it does for all other
pointers. However, in order to actually call this function from a Java program,
you will need to pass some kind of C function pointer object. In C,
this is easy, you just supply a function name as an argument like this:
/* Some callback function */
int add(int a, int b) {
return a+b;
}
...
int r = do_op(x,y,add);
To make this work with SWIG, you will need to do a little extra work. Specifically,
you need to create some function pointer objects using the %constant directive like this:
%constant(int (*)(int,int)) ADD = add;
Now, in a Java program, you would do this:
int r = do_op(x,y, example.ADD)
where example is the module name.
An Example
Here are some files that illustrate this with a simple example:
Notes
- The value of a function pointer must correspond to a function written in C or C++.
It is not possible to pass an arbitrary Java function in as a substitute for a C
function pointer.
- A Java function can be used as a C/C++ callback if you write some
clever typemaps and are very careful about how you create your extension.
This is an advanced topic not covered here.
|