<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
</head>
<body>
<div class="markdown-here-wrapper">
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">Hi
Lain,
this is some interesting work. When looking at the
documentation, and at the examples provided, it is not clear to
me how some features of C++ are supported. E.g. it seems to me
that the bindings you create (esp. downcall handles) are
completely static. That is, if you have B extends A, and both A
and B define a virtual method, you will add a downcall handle in
both classes, one for A</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">
and the other for B</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">.
Then you kind of rely on <em>Java's</em> (not C++'s !!) dynamic
dispatch to make things work -- e.g. when you call A</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">
on an instance of B, the JVM will call B</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">
-- which will result in the correct C++ method being invoked.
While this works for simple examples -- I'm a bit skeptical
about the generality of this approach. Of course, as long as
there's no multiple inheritance, and as long as all the C++
classes are created from the Java side of the fence, this might
even work correctly.</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">But
if some C++ method returns some A* -- what Java wrapper will we
create? The problem here is that the choice of the wrapper (A
vs. B) determines which set of methods will be invoked on that
instance (because we're effectively bypassing C++'s virtual
dispatch).</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">All
things considered, this approach doesn't seem very different
from the jextract PoC I shared -- in the sense that it models
some C++ features <em>to some degree</em> without really
providing full language interop support which, IMHO, is not
possible w/o having a C++ compiler on your side (inline
functions are another issue). But maybe, what you are trying to
say is that, even with a simple PoC like the one I provided,
it's possible to provide meaningful interop for at least <em>some</em>
C++ libraries (like eigen) ?</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">Cheers
Maurizio</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">On
26/02/2025 02:13, Lain Lain wrote:</p>
<blockquote type="cite" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(114, 159, 207) rgb(119, 119, 119); border-inline-start: 2px solid rgb(114, 159, 207); border-left: 2px solid rgb(114, 159, 207); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); caret-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); margin-block: 8px; margin-bottom: 8px; margin-inline: 0px; margin-left: 0px; margin-right: 0px; margin-top: 8px; outline-color: rgb(119, 119, 119); padding-block: 3.2px; padding-bottom: 3.2px; padding-inline: 8px; padding-left: 8px; padding-right: 8px; padding-top: 3.2px; quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
<div class="external-content" id="extcontent-0" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(119, 119, 119); border-left-color: rgb(119, 119, 119); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); caret-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); outline-color: rgb(119, 119, 119); quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
<div style="font-family: Verdana;font-size: 12.0px;">
<div>Hi,</div>
<div>We would like to present you ffmbindings project which
helps to do manual bindings to C++ libraries from Java
using FFM.</div>
<div>Currently it contains bindings to eigen C++ library but
we are going to publish few more this month.</div>
<div> </div>
<div>Source code: <a class="moz-txt-link-freetext" href="https://bitbucket.org/ffmbindings">https://bitbucket.org/ffmbindings</a><br>
Documentation: <a class="moz-txt-link-freetext" href="https://ffmbindings.onrender.com">https://ffmbindings.onrender.com</a></div>
<div> </div>
<div>Any feedback are welcome.</div>
<div> </div>
<div>Thank you,</div>
</div>
</div>
</blockquote>
<div title="MDH:PHA+SGkgTGFpbiw8YnI+dGhpcyBpcyBzb21lIGludGVyZXN0aW5nIHdvcmsuIFdoZW4gbG9va2luZyBhdCB0aGUgZG9jdW1lbnRhdGlvbiwgYW5kIGF0IHRoZSBleGFtcGxlcyBwcm92aWRlZCwgaXQgaXMgbm90IGNsZWFyIHRvIG1lIGhvdyBzb21lIGZlYXR1cmVzIG9mIEMrKyBhcmUgc3VwcG9ydGVkLiBFLmcuIGl0IHNlZW1zIHRvIG1lIHRoYXQgdGhlIGJpbmRpbmdzIHlvdSBjcmVhdGUgKGVzcC4gZG93bmNhbGwgaGFuZGxlcykgYXJlIGNvbXBsZXRlbHkgc3RhdGljLiBUaGF0IGlzLCBpZiB5b3UgaGF2ZSBCIGV4dGVuZHMgQSwgYW5kIGJvdGggQSBhbmQgQiBkZWZpbmUgYSB2aXJ0dWFsIG1ldGhvZCwgeW91IHdpbGwgYWRkIGEgZG93bmNhbGwgaGFuZGxlIGluIGJvdGggY2xhc3Nlcywgb25lIGZvciBBOjptIGFuZCB0aGUgb3RoZXIgZm9yIEI6Om0uIFRoZW4geW91IGtpbmQgb2YgcmVseSBvbiBfSmF2YSdzXyAobm90IEMrKydzICEhKSBkeW5hbWljIGRpc3BhdGNoIHRvIG1ha2UgdGhpbmdzIHdvcmsgLS0gZS5nLiB3aGVuIHlvdSBjYWxsIEE6Om0gb24gYW4gaW5zdGFuY2Ugb2YgQiwgdGhlIEpWTSB3aWxsIGNhbGwgQjo6bSAtLSB3aGljaCB3aWxsIHJlc3VsdCBpbiB0aGUgY29ycmVjdCBDKysgbWV0aG9kIGJlaW5nIGludm9rZWQuIFdoaWxlIHRoaXMgd29ya3MgZm9yIHNpbXBsZSBleGFtcGxlcyAtLSBJJ20gYSBiaXQgc2tlcHRpY2FsIGFib3V0IHRoZSBnZW5lcmFsaXR5IG9mIHRoaXMgYXBwcm9hY2guIE9mIGNvdXJzZSwgYXMgbG9uZyBhcyB0aGVyZSdzIG5vIG11bHRpcGxlIGluaGVyaXRhbmNlLCBhbmQgYXMgbG9uZyBhcyBhbGwgdGhlIEMrKyBjbGFzc2VzIGFyZSBjcmVhdGVkIGZyb20gdGhlIEphdmEgc2lkZSBvZiB0aGUgZmVuY2UsIHRoaXMgbWlnaHQgZXZlbiB3b3JrIGNvcnJlY3RseS48L3A+PHA+QnV0IGlmIHNvbWUgQysrIG1ldGhvZCByZXR1cm5zIHNvbWUgQSogLS0gd2hhdCBKYXZhIHdyYXBwZXIgd2lsbCB3ZSBjcmVhdGU/IFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgY2hvaWNlIG9mIHRoZSB3cmFwcGVyIChBIHZzLiBCKSBkZXRlcm1pbmVzIHdoaWNoIHNldCBvZiBtZXRob2RzIHdpbGwgYmUgaW52b2tlZCBvbiB0aGF0IGluc3RhbmNlIChiZWNhdXNlIHdlJ3JlIGVmZmVjdGl2ZWx5IGJ5cGFzc2luZyBDKysncyB2aXJ0dWFsIGRpc3BhdGNoKS48L3A+PHA+QWxsIHRoaW5ncyBjb25zaWRlcmVkLCB0aGlzIGFwcHJvYWNoIGRvZXNuJ3Qgc2VlbSB2ZXJ5IGRpZmZlcmVudCBmcm9tIHRoZSBqZXh0cmFjdCBQb0MgSSBzaGFyZWQgLS0gaW4gdGhlIHNlbnNlIHRoYXQgaXQgbW9kZWxzIHNvbWUgQysrIGZlYXR1cmVzIF90byBzb21lIGRlZ3JlZV8gd2l0aG91dCByZWFsbHkgcHJvdmlkaW5nIGZ1bGwgbGFuZ3VhZ2UgaW50ZXJvcCBzdXBwb3J0IHdoaWNoLCBJTUhPLCBpcyBub3QgcG9zc2libGUgdy9vIGhhdmluZyBhIEMrKyBjb21waWxlciBvbiB5b3VyIHNpZGUgKGlubGluZSBmdW5jdGlvbnMgYXJlIGFub3RoZXIgaXNzdWUpLiBCdXQgbWF5YmUsIHdoYXQgeW91IGFyZSB0cnlpbmcgdG8gc2F5IGlzIHRoYXQsIGV2ZW4gd2l0aCBhIHNpbXBsZSBQb0MgbGlrZSB0aGUgb25lIEkgcHJvdmlkZWQsIGl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBtZWFuaW5nZnVsIGludGVyb3AgZm9yIGF0IGxlYXN0IF9zb21lXyBDKysgbGlicmFyaWVzIChsaWtlIGVpZ2VuKSA/PC9wPjxwPkNoZWVyczxicj5NYXVyaXppbzwvcD48ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDI2LzAyLzIwMjUgMDI6MTMsIExhaW4gTGFpbiB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOnRyaW5pdHktMWY2MmQ3MGEtMTVhYy00NWUyLWJlOGQtN2NmMTFkZWJhNTQ4LTE3NDA1MzU5ODQ5ODRAM2MtYXBwLW1haWxjb20tbHhhMDYiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgIj48ZGl2IHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTtmb250LXNpemU6IDEyLjBweDsiPjxkaXY+SGksPC9kaXY+Cgo8ZGl2PldlIHdvdWxkIGxpa2UgdG8gcHJlc2VudCB5b3UgZmZtYmluZGluZ3MgcHJvamVjdCB3aGljaCBoZWxwcyB0byBkbyBtYW51YWwgYmluZGluZ3MgdG8gQysrIGxpYnJhcmllcyBmcm9tIEphdmEgdXNpbmcgRkZNLjwvZGl2PgoKPGRpdj5DdXJyZW50bHkgaXQgY29udGFpbnMgYmluZGluZ3MgdG8gZWlnZW4gQysrIGxpYnJhcnkgYnV0IHdlIGFyZSBnb2luZyB0byBwdWJsaXNoIGZldyBtb3JlIHRoaXMgbW9udGguPC9kaXY+Cgo8ZGl2PiZuYnNwOzwvZGl2PgoKPGRpdj5Tb3VyY2UgY29kZTogaHR0cHM6Ly9iaXRidWNrZXQub3JnL2ZmbWJpbmRpbmdzPGJyPgpEb2N1bWVudGF0aW9uOiBodHRwczovL2ZmbWJpbmRpbmdzLm9ucmVuZGVyLmNvbTwvZGl2PgoKPGRpdj4mbmJzcDs8L2Rpdj4KCjxkaXY+QW55IGZlZWRiYWNrIGFyZSB3ZWxjb21lLjwvZGl2PgoKPGRpdj4mbmJzcDs8L2Rpdj4KCjxkaXY+VGhhbmsgeW91LDwvZGl2PjwvZGl2Pgo8L2Jsb2NrcXVvdGU+" aria-hidden="true" style="font-size: 0px; padding: 0px; margin: 0px; block-size: 0px; height: 0px; inline-size: 0px; max-block-size: 0px; max-height: 0px; max-inline-size: 0px; max-width: 0px; overflow-block: hidden; overflow-inline: hidden; overflow: hidden; width: 0px;" class="mdhr-raw">​</div>
</div>
</body>
</html>