summaryrefslogtreecommitdiff
path: root/Examples/java/callback
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/java/callback')
-rw-r--r--Examples/java/callback/Makefile18
-rw-r--r--Examples/java/callback/example.cxx4
-rw-r--r--Examples/java/callback/example.h23
-rw-r--r--Examples/java/callback/example.i13
-rw-r--r--Examples/java/callback/index.html20
-rw-r--r--Examples/java/callback/runme.java56
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()");
+ }
+}
+