On Wednesday, 16 October 2013 at 10:15:17 UTC, Iain Buclaw wrote:
On Wednesday, 16 October 2013 at 10:11:32 UTC, Andrew wrote:
Hello there!
I've decided to learn a bit of D, as I am currently Android
Developer (mostly C++ <- JNI -> Java), I'm trying to create a
D shared library which exports function (with extern (C)) for
invocation from Java.
My .d file contains only a single function returning an int,
.java calls this function several times.
This approach only works if d-function is trivial, e.g. it's
not using any D functionality (I believe that it is related to
GC and memory allocation).
For example, if my d-function just returns some constant
integer, java side receives it. core.stdc.stdio also works and
allows console output, but it's not the case with
std.stdio.writeln and similar functions.
If I use any d-specific functions my program crashes while
calling native code with some weird message like following:
"Invalid memory access of location 0x0 rip=addr".
It seems like D is not initialized at all, maybe there is some
internal function like dinit() which I can call in order to
activate everything?
Thanks.
JNI requires (to some degree) compiler support. This could be
done in gdc as backend support is there because of g++ JNI
interface to gcj. But it would be some magic module or change
to the language to add the Java types to the language.
Regards
Iain.
As far as I know, calling C from Java only requires is <jni.h>
header. It can mimicked with mere D aliases. I'm currently not
talking about calling Java from D, although it could be possible
by writing C-wrapper library.
I just can't understand why D code compiled as a shared library
does not work when called from Java. Why does it (does it?) work
when called from C?