JEP 178 - working example?

Steve Poole spoole at linux.vnet.ibm.com
Tue Jun 4 08:02:52 PDT 2013


On 4 Jun 2013, at 15:16, Bob Vandette <bob.vandette at oracle.com> wrote:

> 
> On Jun 4, 2013, at 3:53 AM, Steve Poole wrote:
> 
>> Thanks Bob -  appreciate your time to give me more information.  I have one more question!
>> 
>> I  could interpret  this statement in your spec change 
>> 
>> "A library L whose image has been combined with the VM is defined as statically linked if and only if the library exports a function called JNI_OnLoad_L."
>> 
>> as indicating that I can take an existing dynamic library L and by adding an JNI_OnLoad_L entry point I can expect that it will be called at 'dynamic' load time. 
>> 
>> Since the wider definition of 'statically linked' is implementation dependent  it would be reasonable for an implementor to decide they wanted this sort of behaviour. 
>> However I'm not sure if that is also your intention / expectation for the OpenJDK reference implementation?   
>> 
> 
> I'm not exactly sure what you are asking?
> 
> The fact that we left the details of how to link a library statically up to the implementation, 
> should not alter the fact that a static library is NOT a dynamically linked library.  
> 
> In the OpenJDK implementation, we limit the scope of where we look for the JNI_OnLoad_L symbol 
> to the currently running executable image and will not attempt to find this symbol in any "not yet" loaded 
> shared libraries.   The dynamic library load process will first load the image into memory and then
> search for a JNI_OnLoad entrypoint.  The static library implementation will look for a JNI_OnLoad_L
> before attempting any loading (dlopen on Linux).  If found, it declares this library to be static and
> treats it as such.  Otherwise it processes the library as a dynamic library.

Ah! - ok got it.  Thanks

> 
> Bob.
> 
>> 
>> 
>> On 30 May 2013, at 15:30, Bob Vandette <bob.vandette at oracle.com> wrote:
>> 
>>> My primary goal for implementing JEP 178 was to eliminate any specification barriers in JDK 8 that would prohibit the
>>> implementation of a Java application that might want to link the entire Java runtime into a single application binary.
>>> 
>>> This allows us to implement the changes that you're suggesting in a JDK 8 implementation without having to 
>>> alter the specification.  This type of spec change is typically only done in major Java releases.
>>> 
>>> We don't yet have any plans to provide the build system changes that would allow an openjdk build to produce
>>> a complete static library implementation.  It's getting pretty late to push these types of changes into JDK8 as we're pretty
>>> close to feature freeze.
>>> 
>>> As for use cases for this change, we're trying to enable the creation of single Java application binaries that can take 
>>> advantage of newer compiler technologies such as link time optimization.   This feature coupled with the JDK 8 profiles will allow 
>>> smaller applications that bundle Java binaries to be deployed on app stores.
>>> 
>>> 
>>> Bob.
>>> 
>>> 
>>> On May 30, 2013, at 6:15 AM, Steve Poole wrote:
>>> 
>>>> Thanks for the quick response Bob.
>>>> 
>>>> This all seems quite manual - are there any plans to add support to OpenJDK to help with this process?   
>>>> 
>>>> 
>>>> 
>>>> On 29 May 2013, at 00:06, Bob Vandette <bob.vandette at oracle.com> wrote:
>>>> 
>>>>> 
>>>>> On May 28, 2013, at 7:06 AM, Steve Poole wrote:
>>>>> 
>>>>>> 
>>>>>> hi everyone,  
>>>>>> 
>>>>>> I've been reading JEP 178  (Statically-Linked JNI Libraries )  http://openjdk.java.net/jeps/178
>>>>>> 
>>>>>> There is a sentence  in the  section on JNI Specification changes that says
>>>>>> 
>>>>>> "A native library may be statically linked with the VM. The manner in which the library and VM image are combined is implementation-dependent."
>>>>>> 
>>>>>> I can't find anything that explains the process  in more detail so posting here.
>>>>>> 
>>>>>> Basically - if I want to statically link my JNI library to Hotspot what are the instructions for the OpenJDK implementation?  
>>>>> 
>>>>> Since the procedure for statically linking binaries into a executable is very platform specific, the specification 
>>>>> intentionally leaves out these details.
>>>>> 
>>>>> The key functional changes that were implemented to support this spec change, were:
>>>>> 
>>>>> 1. Require JNI_OnLoad_{libraryname} for static libraries.
>>>>> 2. Modify the Java API's that load native JNI libraries to support static libraries by detecting the
>>>>> presence of the library specific OnLoad function.
>>>>> 3. Support JNI_OnUnLoad_{libraryname}
>>>>> 
>>>>> So you can either build the entire JDK as static libraries, change every JNI_OnLoad function to be 
>>>>> unique and link them all together with a java launcher.
>>>>> 
>>>>> OR
>>>>> 
>>>>> You can create a single static library, making sure to give it a unique JNI_OnLoad_{libraryname}
>>>>> entrypoint, link it with a program executable that loads the VM via the Java launcher or Invocation APIs.
>>>>> 
>>>>> For example:  If your library name is speciallibrary.a, you would then call System.loadLibrary("speciallibrary")
>>>>> 
>>>>> Once the loadLibrary call succeeds, you can then call any native Java methods defined by the static library.
>>>>> 
>>>>> Bob.
>>>>> 
>>>>> 
>>>>>> 
>>>>>> 
>>>>>> Cheers
>>>>>> 
>>>>>> Steve
>>>>> 
>>>> 
>>> 
>> 
> 



More information about the jdk8-dev mailing list