diff --git a/Doc/Manual/CSharp.html b/Doc/Manual/CSharp.html index fd2ef981f..21b319e29 100644 --- a/Doc/Manual/CSharp.html +++ b/Doc/Manual/CSharp.html @@ -206,6 +206,7 @@ jniclassinterfaces -> imclassinterfaces $javaclassname -> $csclassname $&javaclassname -> $&csclassname $*javaclassname -> $*csclassname +$javaclazzname -> $csclazzname $javainput -> $csinput $jnicall -> $imcall diff --git a/Doc/Manual/Java.html b/Doc/Manual/Java.html index 0984b2ecf..5b61955ab 100644 --- a/Doc/Manual/Java.html +++ b/Doc/Manual/Java.html @@ -5161,6 +5161,14 @@ If the type does not have an associated proxy class, it expands to the type wrap SWIGTYPE_p_unsigned_short is generated when wrapping unsigned short *.

+

+$javaclazzname
+This special variable works like $javaclassname, but expands the fully qualified C++ class into the package name, +if used by the nspace feature, and the proxy class name, mangled for use as a function name. +For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_. +This special variable is usually used for making calls to a function in the intermediary JNI class, as they are mangled with this prefix. +

+

$null
Used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example: diff --git a/Examples/test-suite/csharp/nspace_runme.cs b/Examples/test-suite/csharp/nspace_runme.cs index 91baf6a0f..7ced06a04 100644 --- a/Examples/test-suite/csharp/nspace_runme.cs +++ b/Examples/test-suite/csharp/nspace_runme.cs @@ -56,5 +56,11 @@ public class runme ns.Dispose(); nspaceNamespace.NoNSpacePlease nons = new nspaceNamespace.NoNSpacePlease(); nons.Dispose(); + + // Derived class + nspaceNamespace.Outer.Inner3.Blue blue3 = new nspaceNamespace.Outer.Inner3.Blue(); + blue3.blueInstanceMethod(); + nspaceNamespace.Outer.Inner4.Blue blue4 = new nspaceNamespace.Outer.Inner4.Blue(); + blue4.blueInstanceMethod(); } } diff --git a/Examples/test-suite/java/nspace_runme.java b/Examples/test-suite/java/nspace_runme.java index ca83b7d04..a50bb9ae9 100644 --- a/Examples/test-suite/java/nspace_runme.java +++ b/Examples/test-suite/java/nspace_runme.java @@ -60,5 +60,11 @@ public class nspace_runme { // turn feature off / ignoring nspacePackage.Outer.nspace ns = new nspacePackage.Outer.nspace(); nspacePackage.NoNSpacePlease nons = new nspacePackage.NoNSpacePlease(); + + // Derived class + nspacePackage.Outer.Inner3.Blue blue3 = new nspacePackage.Outer.Inner3.Blue(); + blue3.blueInstanceMethod(); + nspacePackage.Outer.Inner4.Blue blue4 = new nspacePackage.Outer.Inner4.Blue(); + blue4.blueInstanceMethod(); } } diff --git a/Examples/test-suite/nspace.i b/Examples/test-suite/nspace.i index 14be0aa20..82f6e1101 100644 --- a/Examples/test-suite/nspace.i +++ b/Examples/test-suite/nspace.i @@ -73,6 +73,18 @@ namespace Outer { class NoNSpacePlease {}; } // Inner2 + // Derived class + namespace Inner3 { + struct Blue : Inner2::Color { + void blueInstanceMethod() {} + }; + } + namespace Inner4 { + struct Blue : Inner2::Color { + void blueInstanceMethod() {} + }; + } + class SomeClass { public: Inner1::Color::Channel GetInner1ColorChannel() { return Inner1::Color::Transmission; } diff --git a/Lib/csharp/csharp.swg b/Lib/csharp/csharp.swg index 204cf4b2f..1f58db48d 100644 --- a/Lib/csharp/csharp.swg +++ b/Lib/csharp/csharp.swg @@ -841,7 +841,7 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { %typemap(csbody_derived) SWIGTYPE %{ private HandleRef swigCPtr; - internal $csclassname(IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclassnameUpcast(cPtr), cMemoryOwn) { + internal $csclassname(IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } diff --git a/Lib/java/java.swg b/Lib/java/java.swg index f37cba77a..ad7c8074d 100644 --- a/Lib/java/java.swg +++ b/Lib/java/java.swg @@ -1072,7 +1072,7 @@ private long swigCPtr; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { - super($imclassname.SWIG$javaclassnameUpcast(cPtr), cMemoryOwn); + super($imclassname.$javaclazznameSWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx index 0dbed4d1e..55de14285 100644 --- a/Source/Modules/csharp.cxx +++ b/Source/Modules/csharp.cxx @@ -1753,6 +1753,8 @@ public: Delete(attributes); Delete(destruct); + String *csclazzname = Swig_name_member(getNSpace(), proxy_class_name, ""); // mangled full proxy class name + // Emit extra user code Printv(proxy_class_def, typemapLookup(n, "cscode", typemap_lookup_type, WARN_NONE), // extra C# code "\n", NIL); @@ -1770,21 +1772,27 @@ public: Replaceall(proxy_class_def, "$dllimport", dllimport); Replaceall(proxy_class_code, "$dllimport", dllimport); + Replaceall(proxy_class_def, "$csclazzname", csclazzname); + Replaceall(proxy_class_code, "$csclazzname", csclazzname); + // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { - Printv(imclass_cppcasts_code, "\n [DllImport(\"", dllimport, "\", EntryPoint=\"CSharp_", proxy_class_name, "Upcast", "\")]\n", NIL); - Printf(imclass_cppcasts_code, " public static extern IntPtr $csclassnameUpcast(IntPtr objectRef);\n"); + String *upcast_method = Swig_name_member(getNSpace(), proxy_class_name, "SWIGUpcast"); + String *wname = Swig_name_wrapper(upcast_method); + + Printv(imclass_cppcasts_code, "\n [DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); + Printf(imclass_cppcasts_code, " public static extern IntPtr %s(IntPtr jarg1);\n", upcast_method); Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name); Printv(upcasts_code, - "SWIGEXPORT $cbaseclass * SWIGSTDCALL CSharp_$imclazznameUpcast", - "($cclass *objectRef) {\n", " return ($cbaseclass *)objectRef;\n" "}\n", "\n", NIL); + "SWIGEXPORT ", c_baseclass, " * SWIGSTDCALL ", wname, + "(", c_classname, " *jarg1) {\n", " return (", c_baseclass, " *)jarg1;\n" "}\n", "\n", NIL); - Replaceall(upcasts_code, "$cbaseclass", c_baseclass); - Replaceall(upcasts_code, "$imclazzname", proxy_class_name); - Replaceall(upcasts_code, "$cclass", c_classname); + Delete(wname); + Delete(upcast_method); } + Delete(csclazzname); Delete(baseclass); } diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 50b80dc8b..7315bd9a5 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -1762,6 +1762,8 @@ public: Delete(attributes); Delete(destruct); + String *javaclazzname = Swig_name_member(getNSpace(), proxy_class_name, ""); // mangled full proxy class name + // Emit extra user code Printv(proxy_class_def, typemapLookup(n, "javacode", typemap_lookup_type, WARN_NONE), // extra Java code "\n", NIL); @@ -1776,29 +1778,29 @@ public: Replaceall(proxy_class_def, "$imclassname", full_imclass_name); Replaceall(proxy_class_code, "$imclassname", full_imclass_name); + Replaceall(proxy_class_def, "$javaclazzname", javaclazzname); + Replaceall(proxy_class_code, "$javaclazzname", javaclazzname); + // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { - Printv(imclass_cppcasts_code, " public final static native long SWIG$javaclassnameUpcast(long jarg1);\n", NIL); + String *upcast_method = Swig_name_member(getNSpace(), proxy_class_name, "SWIGUpcast"); + String *jniname = makeValidJniName(upcast_method); + String *wname = Swig_name_wrapper(jniname); - Replaceall(imclass_cppcasts_code, "$javaclassname", full_proxy_class_name); + Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method); Printv(upcasts_code, - "SWIGEXPORT jlong JNICALL Java_$jnipackage$imimclass_SWIG$imclazznameUpcast", - "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", + "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", " jlong baseptr = 0;\n" - " (void)jenv;\n" " (void)jcls;\n" " *($cbaseclass **)&baseptr = *($cclass **)&jarg1;\n" " return baseptr;\n" "}\n", "\n", NIL); + " (void)jenv;\n" " (void)jcls;\n" " *(", c_baseclassname, " **)&baseptr = *(", c_classname, " **)&jarg1;\n" + " return baseptr;\n" + "}\n", "\n", NIL); - String *imimclass = makeValidJniName(imclass_name); - String *imclazzname = makeValidJniName(full_proxy_class_name); - Replaceall(upcasts_code, "$cbaseclass", c_baseclass); - Replaceall(upcasts_code, "$imclazzname", imclazzname); - Replaceall(upcasts_code, "$cclass", c_classname); - Replaceall(upcasts_code, "$jnipackage", jnipackage); - Replaceall(upcasts_code, "$imimclass", imimclass); - - Delete(imclazzname); - Delete(imimclass); + Delete(wname); + Delete(jniname); + Delete(upcast_method); } + Delete(javaclazzname); Delete(baseclass); }