From b4e4fe23ca5790ba58cd691754bdadd4a339d38b Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Fri, 30 Dec 2005 11:59:54 +0000 Subject: [PATCH] add tcl+java example git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8140 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- CHANGES.current | 29 +++++++++++++--------- Examples/python/java/example.cxx | 0 Examples/ruby/java/example.cxx | 0 Examples/tcl/check.list | 1 + Examples/tcl/java/Example.java | 29 ++++++++++++++++++++++ Examples/tcl/java/Makefile | 28 +++++++++++++++++++++ Examples/tcl/java/example.i | 10 ++++++++ Examples/tcl/java/runme.tcl | 15 ++++++++++++ Lib/ruby/jstring.i | 3 +-- Lib/tcl/jstring.i | 42 ++++++++++++++++++++++++++++++++ 10 files changed, 144 insertions(+), 13 deletions(-) delete mode 100644 Examples/python/java/example.cxx delete mode 100644 Examples/ruby/java/example.cxx create mode 100644 Examples/tcl/java/Example.java create mode 100644 Examples/tcl/java/Makefile create mode 100644 Examples/tcl/java/example.i create mode 100644 Examples/tcl/java/runme.tcl create mode 100644 Lib/tcl/jstring.i diff --git a/CHANGES.current b/CHANGES.current index 1fbb58ddd..d7554cba9 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -3,24 +3,31 @@ Version 1.3.28 (unreleased). 12/30/2005: mmatus - - Add initial support for gcj and Java -> Python. See - - Examples/python/java + - Add initial support for gcj and Java -> mechanism. - to see how to use gcj and how to export java classes into - python. + See examples in: + + Examples/python/java + Examples/ruby/java + Examples/tcl/java + + to see how to use gcj+swig to export java classes into + python/ruby/tcl. The idea is to put all the common code for gcj inside Lib/gcj - such that it can be used from other languages. - - Python provide a simple jstring.i interface, which can be - used as a modelo to ruby,tcl and perl, ie, the languages - that use the UTL. + and localize especific issues as jstring, as can be found + in - + Lib/python/jstring.i + Lib/ruby/jstring.i + Lib/tcl/jstring.i + + Using the UTL, this is very easy, and the perl version for + jstring.i will be next. + 12/29/2005: mmatus - Add the copyctor feature/directive to enable the automatic diff --git a/Examples/python/java/example.cxx b/Examples/python/java/example.cxx deleted file mode 100644 index e69de29bb..000000000 diff --git a/Examples/ruby/java/example.cxx b/Examples/ruby/java/example.cxx deleted file mode 100644 index e69de29bb..000000000 diff --git a/Examples/tcl/check.list b/Examples/tcl/check.list index b1e290e7f..e6cd7a26b 100644 --- a/Examples/tcl/check.list +++ b/Examples/tcl/check.list @@ -13,3 +13,4 @@ reference simple value variables +java diff --git a/Examples/tcl/java/Example.java b/Examples/tcl/java/Example.java new file mode 100644 index 000000000..91ddb1ac5 --- /dev/null +++ b/Examples/tcl/java/Example.java @@ -0,0 +1,29 @@ +public class Example { + public int mPublicInt; + + public Example() { + mPublicInt = 0; + } + + public Example(int IntVal) { + mPublicInt = IntVal; + } + + + public int Add(int a, int b) { + return (a+b); + } + + public float Add(float a, float b) { + return (a+b); + } + + public String Add(String a, String b) { + return (a+b); + } + + public Example Add(Example a, Example b) { + return new Example(a.mPublicInt + b.mPublicInt); + } +} + diff --git a/Examples/tcl/java/Makefile b/Examples/tcl/java/Makefile new file mode 100644 index 000000000..be4994420 --- /dev/null +++ b/Examples/tcl/java/Makefile @@ -0,0 +1,28 @@ +CXX = g++ +TOP = ../.. +SWIG = $(TOP)/../preinst-swig +CXXSRCS = +TARGET = example +INTERFACE = example.i +LIBS = -lm + +all:: Example.class + $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ + TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' CXX="gcj" CFLAGS="-fPIC" \ + TCL_CXXSHARED="gcj -fPIC -shared Example.class -lstdc++ " DEFS='' tcl_cpp + + +clean:: + $(MAKE) -f $(TOP)/Makefile tcl_clean + rm -f *.class Example.h + +check: all + +run: + tclsh runme.tcl + +Example.class: Example.java + gcj -v || exit 0 + gcj -fPIC -C -c -g Example.java + gcjh Example + diff --git a/Examples/tcl/java/example.i b/Examples/tcl/java/example.i new file mode 100644 index 000000000..897aacd2c --- /dev/null +++ b/Examples/tcl/java/example.i @@ -0,0 +1,10 @@ +%module example +%include +%include + +%{ +#include "Example.h" +%} + + +%include Example.h diff --git a/Examples/tcl/java/runme.tcl b/Examples/tcl/java/runme.tcl new file mode 100644 index 000000000..6caf0079f --- /dev/null +++ b/Examples/tcl/java/runme.tcl @@ -0,0 +1,15 @@ +catch { load ./example[info sharedlibextension] example} + +JvCreateJavaVM NULL +JvAttachCurrentThread NULL NULL +Example e1 1 +Example e2 2 + +puts "[e1 cget -mPublicInt]" +puts "[e2 cget -mPublicInt]" + +puts "[e2 Add 1 2]" +puts "[e2 Add 1.0 2.0]" +puts "[e2 Add '1' '2']" + +JvDetachCurrentThread diff --git a/Lib/ruby/jstring.i b/Lib/ruby/jstring.i index f91dd56cd..6922dadcd 100644 --- a/Lib/ruby/jstring.i +++ b/Lib/ruby/jstring.i @@ -26,8 +26,7 @@ SWIG_From(jstring)(jstring val) { if (!val) { return Qnil; - } - else { + } else { jint len = JvGetStringUTFLength(val); char buf[len]; JvGetStringUTFRegion(val, 0, len, buf); diff --git a/Lib/tcl/jstring.i b/Lib/tcl/jstring.i new file mode 100644 index 000000000..7fb7b89fe --- /dev/null +++ b/Lib/tcl/jstring.i @@ -0,0 +1,42 @@ +%include + +%fragment(SWIG_AsVal_frag(jstring),"header") { +SWIGINTERN int +SWIG_AsVal_dec(jstring)(Tcl_Obj * obj, jstring *val) +{ + int len = 0; + const char *cstr = Tcl_GetStringFromObj(obj, &len); + if (!cstr || (strcmp(cstr,"NULL") == 0)) { + if (val) *val = 0; + return SWIG_OK; + } else { + int len = 0; + const Tcl_UniChar *ucstr = Tcl_GetUnicodeFromObj(obj,&len); + if (val) { + *val = JvNewString((const jchar*)ucstr, len); + } + } + + return SWIG_NEWOBJ; +} +} + +%fragment(SWIG_From_frag(jstring),"header") { +SWIGINTERNINLINE Tcl_Obj * +SWIG_From_dec(jstring)(jstring val) +{ + if (!val) { + return Tcl_NewStringObj("NULL",-1); + } else { + return Tcl_NewUnicodeObj((Tcl_UniChar *)JvGetStringChars(val),JvGetStringUTFLength(val)); + } +} +} + +%typemaps_asvalfrom(%checkcode(STRING), + %arg(SWIG_AsVal(jstring)), + %arg(SWIG_From(jstring)), + %arg(SWIG_AsVal_frag(jstring)), + %arg(SWIG_From_frag(jstring)), + java::lang::String *); +