<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Hello,</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">I&#39;m trying to understand the capabilities and limitations of using C++ libraries from Java. One of the more complete examples I could find was the:</div><div class="gmail_default"><ul><li>





<p style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">CxxMethodsTest.java/</span><span style="font-variant-ligatures:no-common-ligatures">methodsTest.cpp</span></p>





</li></ul><div><font face="verdana, sans-serif">test from the GraalVM distribution. I removed the unit test framework, but I find that there are some operations which fail (in Java):</font></div><div><ol><li><font face="verdana, sans-serif">retrieving a class: </font>testLibrary.getMember(&quot;Point&quot;)</li><li><font face="verdana, sans-serif">retrieving a class method: </font>squaredEuclideanDistance = testLibrary.getMember(&quot;squaredEuclideanDistance&quot;)</li><li><font face="verdana, sans-serif">invoking a class member: </font>testLibrary.invokeMember(&quot;setY&quot;, point2, 8)</li></ol><div><font face="verdana, sans-serif">I am using GraalVM 21.0.0, and I compiled the C++ like:</font></div><div><ul><li>





<p style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">clang++ -std=c++11 -shared -o methodsTest.so methodsTest.cpp -lgraalvm-llvm</span></p></li></ul><div><font face="verdana, sans-serif">I suppose maybe the testing framework may compile the C++ source code differently. Any idea where I&#39;ve gone astray? I think they may compile without name mangling or perhaps they compile the cpp file on the fly... I don&#39;t know exactly what happens behind the scenes with:</font></div><div><ul><li>





<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-s1" style="font-variant-ligatures:no-common-ligatures">testLibrary = loadTestBitcodeValue(&quot;methodsTest.cpp&quot;)</span></p></li></ul><div><font face="verdana, sans-serif">My modified methodsTest.cpp  file is down below.</font></div><div><font face="verdana, sans-serif"><br></font></div><div><span style="font-family:verdana,sans-serif">It seems like these are the key points:</span><br></div></div><div><ul><li><font face="verdana, sans-serif">pointers should be used to pass/return objects (no mapping from List&lt;T&gt; to std::list&lt;T&gt; for example)</font></li><li><font face="verdana, sans-serif">mangled names do not work (unless the mangled name is used for lookup, of course)</font></li><li><font face="verdana, sans-serif">class based inherited methods work (using an object pointer)</font></li><li><font face="verdana, sans-serif">looking up methods and supplying the object and args does not work (e.g. squareEuclideanDistance above)</font></li><li><font face="verdana, sans-serif">retrieving object constructor as a function (e.g. getMember(&quot;Point&quot;) above)</font></li></ul><div><font face="verdana, sans-serif">Does this seem right? I&#39;ve looked at the examples I could find on the GraalVM.org website but are there any bigger examples of Java/C++ integration via GraalVM?</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">thanks for any advice,</font></div><div><font face="verdana, sans-serif">Darrell</font></div><div><font face="verdana, sans-serif"><br></font></div><div><font face="verdana, sans-serif">/*<br> * Copyright (c) 2020, Oracle and/or its affiliates.<br> *<br> * All rights reserved.<br> *<br> * Redistribution and use in source and binary forms, with or without modification, are<br> * permitted provided that the following conditions are met:<br> *<br> * 1. Redistributions of source code must retain the above copyright notice, this list of<br> * conditions and the following disclaimer.<br> *<br> * 2. Redistributions in binary form must reproduce the above copyright notice, this list of<br> * conditions and the following disclaimer in the documentation and/or other materials provided<br> * with the distribution.<br> *<br> * 3. Neither the name of the copyright holder nor the names of its contributors may be used to<br> * endorse or promote products derived from this software without specific prior written<br> * permission.<br> *<br> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND ANY EXPRESS<br> * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF<br> * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE<br> * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,<br> * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE<br> * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED<br> * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING<br> * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED<br> * OF THE POSSIBILITY OF SUCH DAMAGE.<br> */<br>#include &lt;graalvm/llvm/polyglot.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;math.h&gt;<br><br>#define EXTERN extern &quot;C&quot;<br><br>class Point {<br>protected:<br>    int x;<br>    int y;<br><br>public:<br>    Point();<br>    int getX();<br>    int getY();<br>    void setX(int val);<br>    void setY(int val);<br>    double squaredEuclideanDistance(Point *other);<br>};<br><br>POLYGLOT_DECLARE_TYPE(Point)<br><br>class XtendPoint : public Point {<br>private:<br>    int z;<br><br>public:<br>    XtendPoint();<br>    int getZ();<br>    void setZ(int val);<br>    int getZ(int constant);<br>    int getX();<br>};<br><br>POLYGLOT_DECLARE_TYPE(XtendPoint)<br><br>//class methods<br><br>Point::Point() {<br>    x = 0;<br>    y = 0;<br>}<br><br>int Point::getX() {<br>    return x;<br>}<br><br>int Point::getY() {<br>    return y;<br>}<br><br>void Point::setX(int val) {<br>    x = val;<br>}<br><br>void Point::setY(int val) {<br>    y = val;<br>}<br><br>double Point::squaredEuclideanDistance(Point *other) {<br>    double dX = (double) (x - other-&gt;x);<br>    double dY = (double) (y - other-&gt;y);<br>    return dX * dX + dY * dY;<br>}<br><br>XtendPoint::XtendPoint() {<br>    z = 0;<br>}<br><br>int XtendPoint::getZ() {<br>    return z;<br>}<br><br>void XtendPoint::setZ(int dZ) {<br>    z = dZ;<br>}<br><br>int XtendPoint::getZ(int constantOffset) {<br>    return z + constantOffset;<br>}<br><br>int XtendPoint::getX() {<br>    return x * 2;<br>}<br><br>//functions<br>EXTERN void *allocNativePoint() {<br>    Point *ret = (Point *) malloc(sizeof(*ret));<br>    return polyglot_from_Point(ret);<br>}<br><br>EXTERN void *allocNativeXtendPoint() {<br>    XtendPoint *ret = (XtendPoint *) malloc(sizeof(*ret));<br>    return polyglot_from_XtendPoint(ret);<br>}<br><br>EXTERN void swap(Point *p, Point *q) {<br>    Point tmp = *q;<br>    *q = *p;<br>    *p = tmp;<br>}<br><br>EXTERN void freeNativePoint(Point *p) {<br>    free(p);<br>}<br><br>EXTERN void freeNativeXtendPoint(XtendPoint *p) {<br>    free(p);<br>}<br></font></div><div><font face="verdana, sans-serif"><br></font></div></div></div></div></div></div>