diff options
Diffstat (limited to 'Examples/java/callback')
-rw-r--r-- | Examples/java/callback/Makefile | 18 | ||||
-rw-r--r-- | Examples/java/callback/example.cxx | 4 | ||||
-rw-r--r-- | Examples/java/callback/example.h | 23 | ||||
-rw-r--r-- | Examples/java/callback/example.i | 13 | ||||
-rw-r--r-- | Examples/java/callback/index.html | 20 | ||||
-rw-r--r-- | Examples/java/callback/runme.java | 56 |
6 files changed, 134 insertions, 0 deletions
diff --git a/Examples/java/callback/Makefile b/Examples/java/callback/Makefile new file mode 100644 index 0000000..14c3017 --- /dev/null +++ b/Examples/java/callback/Makefile @@ -0,0 +1,18 @@ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +CXXSRCS = example.cxx +TARGET = example +INTERFACE = example.i +SWIGOPT = + +all:: java + +java:: + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' java_cpp + javac *.java + +clean:: + $(MAKE) -f $(TOP)/Makefile java_clean + +check: all diff --git a/Examples/java/callback/example.cxx b/Examples/java/callback/example.cxx new file mode 100644 index 0000000..450d756 --- /dev/null +++ b/Examples/java/callback/example.cxx @@ -0,0 +1,4 @@ +/* File : example.cxx */ + +#include "example.h" + diff --git a/Examples/java/callback/example.h b/Examples/java/callback/example.h new file mode 100644 index 0000000..1a0e8c4 --- /dev/null +++ b/Examples/java/callback/example.h @@ -0,0 +1,23 @@ +/* File : example.h */ + +#include <cstdio> +#include <iostream> + +class Callback { +public: + virtual ~Callback() { std::cout << "Callback::~Callback()" << std:: endl; } + virtual void run() { std::cout << "Callback::run()" << std::endl; } +}; + + +class Caller { +private: + Callback *_callback; +public: + Caller(): _callback(0) {} + ~Caller() { delCallback(); } + void delCallback() { delete _callback; _callback = 0; } + void setCallback(Callback *cb) { delCallback(); _callback = cb; } + void call() { if (_callback) _callback->run(); } +}; + diff --git a/Examples/java/callback/example.i b/Examples/java/callback/example.i new file mode 100644 index 0000000..90beda0 --- /dev/null +++ b/Examples/java/callback/example.i @@ -0,0 +1,13 @@ +/* File : example.i */ +%module(directors="1") example +%{ +#include "example.h" +%} + +%include "std_string.i" + +/* turn on director wrapping Callback */ +%feature("director") Callback; + +%include "example.h" + diff --git a/Examples/java/callback/index.html b/Examples/java/callback/index.html new file mode 100644 index 0000000..c254520 --- /dev/null +++ b/Examples/java/callback/index.html @@ -0,0 +1,20 @@ +<html> +<head> +<title>SWIG:Examples:java:callback</title> +</head> + +<body bgcolor="#ffffff"> + + +<tt>SWIG/Examples/python/extend/</tt> +<hr> + +<H2>Implementing C++ callbacks in Java</H2> + +<p> +This example illustrates how to use directors to implement C++ callbacks in Java. +</p> + +<hr> +</body> +</html> diff --git a/Examples/java/callback/runme.java b/Examples/java/callback/runme.java new file mode 100644 index 0000000..4090f0a --- /dev/null +++ b/Examples/java/callback/runme.java @@ -0,0 +1,56 @@ +public class runme +{ + static { + try { + System.loadLibrary("example"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String[] args) + { + System.out.println("Adding and calling a normal C++ callback"); + System.out.println("----------------------------------------"); + + Caller caller = new Caller(); + Callback callback = new Callback(); + + caller.setCallback(callback); + caller.call(); + caller.delCallback(); + + callback = new JavaCallback(); + + System.out.println(); + System.out.println("Adding and calling a Java callback"); + System.out.println("------------------------------------"); + + caller.setCallback(callback); + caller.call(); + caller.delCallback(); + + // Test that a double delete does not occur as the object has already been deleted from the C++ layer. + // Note that the garbage collector can also call the delete() method via the finalizer (callback.finalize()) + // at any point after here. + callback.delete(); + + System.out.println(); + System.out.println("java exit"); + } +} + +class JavaCallback extends Callback +{ + public JavaCallback() + { + super(); + } + + public void run() + { + System.out.println("JavaCallback.run()"); + } +} + |