<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
On 2018-03-28 23:53, Martin Buchholz wrote:<br>
<blockquote type="cite"
cite="mid:CA+kOe09d+oua_9zBrSu8Du48kiY+ZzMT=ytW5iEopwB28pNv0w@mail.gmail.com">
<div dir="ltr">
<div class="gmail_extra">I can't find any documentation for what
JNIEXPORT and friends actually do.</div>
<div class="gmail_extra">People including myself have been
cargo-culting <span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">JNIEXPORT
and JNICALL for decades.</span></div>
<div class="gmail_extra"><span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Why
aren't they in the JNI spec?</span></div>
</div>
</blockquote>
That surprises me. I'm quite certain that javah (or rather, java -h
nowadays) generate header files with JNIEXPORT and JNICALL.<br>
<br>
As you can see in the jni.h and jni_md.h files, JNIEXPORT equals
__attribute__((visibility("default"))) for compilers that support it
(gcc and friends), and __declspec(dllexport) for Windows. This
means, that the symbol should be exported. (And it's ignored if you
use mapfiles aka linker scripts.)<br>
<br>
As for JNICALL, it's empty on most compilers, but evaluates to
__stdcall on Windows. This defines the calling convention to use.
This is required for JNI calls from Java. (Ask the JVM team why.)
While it's not technically required for calling from one dll to
another, it's good practice to use it all time to be consistent. In
any way, it doesn't hurt us.<br>
<br>
<blockquote type="cite"
cite="mid:CA+kOe09d+oua_9zBrSu8Du48kiY+ZzMT=ytW5iEopwB28pNv0w@mail.gmail.com">
<div dir="ltr">
<div class="gmail_extra"><span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
</span></div>
<div class="gmail_extra"><span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">---</span></div>
<div class="gmail_extra"><span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
</span></div>
<div class="gmail_extra"><span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">It's
fishy that the attribute <span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">externally_visible
(which seems very interesting!) is ARM specific.</span></span></div>
<div class="gmail_extra"><span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
</span></span></div>
<div class="gmail_extra"><span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">
<div class="gmail_extra"> #ifdef ARM</div>
<div class="gmail_extra"> #define JNIEXPORT
__attribute__((externally_visible,visibility("default")))</div>
<div class="gmail_extra"> #define JNIIMPORT
__attribute__((externally_visible,visibility("default")))</div>
</span></div>
</div>
</blockquote>
<br>
Yeah, this is broken on so many levels. :-(<br>
<br>
The ARM here goes back to the old Oracle proprietary arm32 port.
This used lto, link time optimization, to get an absolutely minimal
runtime, at expense of a extremely long built time. (I think linking
libjvm took like 20 minutes.) But when using lto, you also need to
decorate your functions with the externally_visible attribute. So
this was added to get hotspot to export the proper symbols (since
they, too, used the jni.h file). <br>
<br>
So, in short, we should:<br>
1) have used a special, local jni.h file for the proprietary arm
port, and/or<br>
2) added the externally_visible attribute not based on platform, but
on the existence of lto.<br>
<br>
At this point in time, we're not building the old 32-bit arm port,
and I doubt anyone does. And even if so, we could probably remove
the lto part, and thus remove this from jni_md.h. If you want,
please file a bug.<br>
<br>
/Magnus<br>
<br>
<blockquote type="cite"
cite="mid:CA+kOe09d+oua_9zBrSu8Du48kiY+ZzMT=ytW5iEopwB28pNv0w@mail.gmail.com">
<div dir="ltr">
<div class="gmail_extra"><span
style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">
<div class="gmail_extra"> #else</div>
<div class="gmail_extra"> #define JNIEXPORT
__attribute__((visibility("default")))</div>
<div class="gmail_extra"> #define JNIIMPORT
__attribute__((visibility("default")))</div>
<div class="gmail_extra"> #endif</div>
<div><br>
</div>
</span></div>
</div>
</blockquote>
<br>
</body>
</html>