/trunk/Examples/java/funcptr/index.html
HTML | 91 lines | 67 code | 24 blank | 0 comment | 0 complexity | 9557ec89f9af17d181725375106dc419 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
- <html>
- <head>
- <title>SWIG:Examples:java:funcptr</title>
- </head>
- <body bgcolor="#ffffff">
- <tt>SWIG/Examples/java/funcptr/</tt>
- <hr>
- <H2>Pointers to Functions</H2>
- <p>
- Okay, just what in the heck does SWIG do with a declaration like this?
- <blockquote>
- <pre>
- int do_op(int a, int b, int (*op)(int, int));
- </pre>
- </blockquote>
- Well, it creates a wrapper as usual. Of course, that does raise some
- questions about the third argument (the pointer to a function).
- <p>
- 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:
- <blockquote>
- <pre>
- /* Some callback function */
- int add(int a, int b) {
- return a+b;
- }
- ...
- int r = do_op(x,y,add);
- </pre>
- </blockquote>
- 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:
- <blockquote>
- <pre>
- %constant(int (*)(int,int)) ADD = add;
- </pre>
- </blockquote>
- Now, in a Java program, you would do this:
- <blockquote>
- <pre>
- int r = do_op(x,y, example.ADD)
- </pre>
- </blockquote>
- where <tt>example</tt> is the module name.
- <h2>An Example</h2>
- Here are some files that illustrate this with a simple example:
- <ul>
- <li><a href="example.c">example.c</a>
- <li><a href="example.h">example.h</a>
- <li><a href="example.i">example.i</a> (SWIG interface)
- <li><a href="runme.java">runme.java</a> (Sample program)
- </ul>
- <h2>Notes</h2>
- <ul>
- <li>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.
- <p>
- <li>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.
- </ul>
- <hr>
- </body>
- </html>