<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>