diff options
Diffstat (limited to 'Examples/test-suite/java/director_ownership_runme.java')
-rw-r--r-- | Examples/test-suite/java/director_ownership_runme.java | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/Examples/test-suite/java/director_ownership_runme.java b/Examples/test-suite/java/director_ownership_runme.java new file mode 100644 index 000000000..c038f56a4 --- /dev/null +++ b/Examples/test-suite/java/director_ownership_runme.java @@ -0,0 +1,42 @@ +import director_ownership.*; + +public class director_ownership_runme { + + static { + try { + System.loadLibrary("director_ownership"); + } 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 set_content_and_release(Container container, ContentBase content) { + content.swigReleaseOwnership(); + container.set_content(content); + } + + public static void main(String argv[]) { + + Container container = new Container(); + + // make a content in java (cMemoryOwn true) + ContentBase content_java = new ContentDerived(); + + // make a content in c++ (cMemoryOwn true) + ContentBase content_cpp = director_ownership.make_content(); + + set_content_and_release(container, content_java); + if (!container.get_content().get_name().equals("ContentDerived")) + throw new RuntimeException("did not get ContentDerived"); + + // when swigReleaseOwnership() is called on content_cpp, swig tries a static_cast to director and calls the method + // director->swig_java_change_ownership. The content created in c++ native library is not a director, therefore a + // segfault may occur. + // With a check done using dynamic_cast this issue could be avoided. + set_content_and_release(container, content_cpp); + if (!container.get_content().get_name().equals("ContentDerived")) + throw new RuntimeException("did not get ContentDerived"); + } +} + |