working with native libraries in java - jug ru...

112
Working with Native Libraries in Java Vladimir Ivanov HotSpot JVM Compile r Oracle Corp. Twitter: @iwan0www OpenJDK: vlivanov 23.04.2016

Upload: others

Post on 27-May-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

1 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Working with Native Libraries in Java

Vladimir Ivanov HotSpot JVM Compile r Oracle Corp.

Twitter: @iwan0www OpenJDK: vlivanov

23.04.2016

Page 2: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

2 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Safe Harbor Statement

The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

Page 3: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

3 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Why?

§ LAPACK –  Linear Algebra Package

Page 4: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

4 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Why?

§ LAPACK –  Linear Algebra Package –  written in Fortran 90 –  highly optimized

§  “The original goal of the LAPACK was to … run efficiently on shared-memory vector and parallel processors.”

Page 5: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

5 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Why?

§ LAPACK (Linear Algebra Package) –  invoke library code –  pass data into library –  access data from Java

Page 6: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

6 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

§ Existing –  Java Native Interface (JNI) & JNR library –  java.nio.DirectByteBuffer –  sun.misc.Unsafe (get*/set*)

§  JDK9 –  j.l.i.VarHandle views over ByteBuffers

§ Future –  Project Panama

Page 7: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

7 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Native Code

Page 8: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

8 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI @since 1.1

Page 9: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

9 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI

classLibC{staticnativelonggetpid();}

jlongJNICALLJava_LibC_getpid(JNIEnv*env,jclassc){ returngetpid();}

Usage scenario

Page 10: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

10 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI

jlongJNICALLJava_...(JNIEnv*env, jclasscls, jobjectobj){jmethodIDmid=env->GetMethodID(cls,“m”,“(I)J”);jlongresult=env->CallLongMethod(obj,mid,10);

Upcall

Page 11: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

11 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI

jlongJNICALLJava_...(JNIEnv*env, jclasscls, jobjectobj){jfieldIDfid=env->GetFieldID(cls,“f”,“J”);jlongresult=env->GetLongField(obj,fid);jlongresult=env->SetLongField(obj,fid,10);

Data access

Page 12: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

12 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI

§ Operations on –  Classes –  Strings –  Arrays –  Monitors

Native API: JNIEnv

Page 13: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

13 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Java Frame

Java Heap Native Memory

Native Frame

GC roots

Page 14: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

14 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Java Heap Native Memory

Java Frame Native Frame

GC roots

Page 15: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

15 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

jobjectraw ptr address

Java Heap

Native Memory

ptr

Page 16: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

16 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

jobjectraw ptr address

Java Heap

Native Memory

ptr

Page 17: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

17 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Java Heap Native MemoryH

andl

es

Java Frame Native Frame

GC roots

Page 18: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

18 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Java

Native

Java Heap

Native Memory

VM

Thread State

Anatomy of JNI call

Page 19: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

19 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Java

Native

Java Heap

Native Memory

VM

Thread State

Anatomy of JNI call Safepoints

Page 20: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

20 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI

§ Pros –  seamless integration

§  looks like a Java method –  rich native API to interact with Java

§ Cons –  manual binding –  invocation overhead

Page 21: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

21 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI

A victim of its own success?

Page 22: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

22 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI Sum elements

jintJNICALLJava_...(JNIEnv*env,jclassc,jobjectarr){jintlen=(*env)->GetArrayLength(env,arr);jbyte*a=(*env)->GetPrimitiveArrayCritical(env,arr,0);…returnsum;}

empty sum 1 sum 103 sum 106 JNI 11.4±0.3 ns 178±7.1 ns 798±32 ns 641±51 µs

Page 23: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

23 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Critical JNI Sum elements

jintJNICALLJavaCritical_...(jintlength,jbyte*first){...returnsum;}

empty sum 1 sum 103 sum 106 JNI 11.4±0.3 ns 178.0±7.1 ns 798±32 ns 641±51 µs CriticalJNI 11.4±0.3 ns 17.2±0.8 ns 680±22 ns 636±12 µs

Page 24: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

24 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Critical JNI

§ only static, non-synchronized methods supported § no JNIEnv* § arguments: primitives or primitive arrays

–  [I => (length, I*) –  null => (0, NULL)

§ no object arguments

Page 25: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

25 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

intprintf(constchar*format,...)

Page 26: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

26 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

voidqsort(void*base,size_tnel,size_twidth,int(*cmp)(constvoid*,constvoid*));

Page 27: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

27 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNR Java Native Runtime

Page 28: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

28 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNR

public interface LibC { @pid_t long getpid(); } LibC lib = LibraryLoader .create(LibC.class) .load("c");

libc.getpid()

Usage scenario

JNRJava

Native

bindings

Interfaces

libffi

Target

User-defined

generated on-the-fly

Page 29: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

29 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

DEMO

§ native call –  getpid

§  structs –  gettimeofday

§ qsort –  upcalls

Page 30: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

30 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNR

§ Pros –  automatic binding of native methods

§ Cons –  manual interface extraction

§  doesn’t scale –  still uses JNI to perform native calls

Page 31: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

31 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI Easier, safer, faster!

Page 32: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

32 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

“If non-Java programmers find some library useful and easy to access, it should be similarly accessible to Java programmers.”

John Rose, JVM Architect,

Oracle Corporation

Page 33: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

33 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Project Panama “Bridging the gap”

Page 34: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

34 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Page 35: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

35 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI

pid_t get_pid();

Page 36: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

36 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI

publicinterfaceLibC{longgetpid();}LibClibc=Library .load(LibC.class,“c”);libc.getpid();

Easier

j.l.iJava

Native

bindings

Interfaces

JVM stubs

Target

User-defined

Library

generated on-the-fly

produced by jextract

Page 37: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

37 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI

publicinterfaceLibC{longgetpid();}LibClibc=Library.load(LibC.class,“c”/*lib_name*/);libc.getpid();

Easier

Page 38: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

38 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI

publicinterfaceLibC{longgetpid();}LibClibc=Library.load(LibC.class,“c”/*lib_name*/);libc.getpid();

Easier

Page 39: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

39 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI Faster

callq 0x1057b2eb0 ; getpid entry

Page 40: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

40 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI

MethodTypemt=MethodType.methodType(int.class);//pid_tMethodHandlemh=MethodHandles.lookup().findNative("getpid",mt);intpid=(int)mh.invokeExact();

Faster

getpid JNI 13.7 ± 0.5 ns Direct call 3.4 ± 0.2 ns

Page 41: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

41 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI

§ no crashes § no leaks § no hangs § no privilege escalation § no unguarded casts

Safer

Page 42: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

42 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI Trust Levels

Untrusted

Page 43: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

43 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI Trust Levels

Trusted

Page 44: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

44 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI Trust Levels

Privileged

Page 45: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

45 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI

Page 46: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

46 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI gettimeofday

/*time.h*/struct{time_ttv_sec;suseconds_ttv_usec;}timeval;

intgettimeofday(structtimeval*tv,structtimezone*tz);

struct{inttz_minuteswest;inttz_dsttime;}timezone;

Page 47: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

47 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Carrier Types

§ Javabooleanbyteshortcharintlong

§ Ccharshortfloatintlonglonglong

?

Page 48: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

48 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Carrier Types

§ Javaboolean(uint8_t)byte(int8_t)short(int16_t)char(uint16_t)int(int32_t)long(int64_t)

§ Ccharshortfloatintlonglonglong

?

Page 49: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

49 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI $ jextract time.h

interfaceTime{interfaceTimeval{longtv_sec$get();voidtv_sec$set(long);longtv_usec$get();voidtv_usec$set(long);}

intgettimeofday(Timeval,Timezone);

interfaceTimezone{inttz_...$get();voidtz_...$set(int);inttz_...$get();voidtz_...$set(int);}

Page 50: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

50 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Foreign Layouts

§ Native data requires special address arithmetic –  Native layouts should not be built into the JVM (sorry, no native classes) –  Native types are unsafe, so trusted code must manage the bits

§ Solution: A metadata-driven Layout API

§ As a bonus, layouts other than C and Java are naturally supported –  Network protocols, specialized in-memory data stores, mapped files, etc.

50

Page 51: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

51 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI Data Layout

interfaceTimeval{…@Offset(offset=0L)longtv_sec$get();…@Offset(offset=64L)longtv_usec$get();…§ work on Layout Definition Language (LDL) is in progress

–  https://github.com/J9Java/panama-docs/blob/master/StateOfTheLDL.html

Page 52: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

52 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI Runtime Librarylib=Library.create(“c”);Timetime=lib.create(Time.class);Timevaltval=lib.create(Timeval.class);intres=time.gettimeofday(tval,null);if(res==0){longtv_sec=tval.tv_sec$get();longtv_usec=tval.tv_usec$get();}

Page 53: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

53 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI Resources

Timevaltval;try{tval=lib.create(Timeval.class);intres=time.gettimeofday(tval,null);if(res==0){longtv_sec=tval.tv_sec$get();longtv_usec=tval.tv_usec$get();}else{/*errorhandling*/}}finally{lib.free(tval);tval=null;}

Page 54: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

54 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI Resources

interfaceTimevalextendsAutoCloseable{…}try(Timevaltval=lib.create(Timeval.class)){intres=time.gettimeofday(tval,null);if(res==0){longtv_sec=tval.tv_sec$get();longtv_usec=tval.tv_usec$get();}else{/*errorhandling*/}}

Page 55: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

55 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI “Civilizer”

interfaceTimeval{voidgettimeofday(Timeval,Timezone)throwsErrNo;}try(Timevaltval=lib.create(Timeval.class)){time.gettimeofday(tval,null);//throwsexceptionlongtv_sec=tval.tv_sec$get();longtv_usec=tval.tv_usec$get();}

Page 56: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

56 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI Variadic Function

int printf(const char *format, ...)

Page 57: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

57 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI jextract + Civilizer

//int printf(const char *format, ...) interfaceStdio{…//Rawintprintf(Pointer<Byte>format,byte[]args);//Civilizedvoidprintf(Stringformat,Object…args);

Page 58: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

58 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Optimize checks

void run(MyClass obj) { obj.nativeFunc1(); // checks & state trans. obj.nativeFunc2(); // checks & state trans. obj.nativeFunc3(); // checks & state trans. }

58

Page 59: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

59 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Optimize checks

void run(MyClass obj) { obj.f1(); // NPE obj.f2(); // NPE obj.f3(); // NPE }

Page 60: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

60 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Optimize checks

void run(MyClass obj) { if (obj == null) jump throwNPE_stub; call MyClass::f(obj); call MyClass::f1(obj); call MyClass::f3(obj); }

60

Page 61: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

61 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Optimize checks

void run(MyClass obj) { obj.nativeFunc1(); // checks & state trans. obj.nativeFunc2(); // checks & state trans. obj.nativeFunc3(); // checks & state trans. }

61

Page 62: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

62 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Optimize checks

void run(MyClass obj) { if (!performChecks()) jump failed_stub; call transJavaToNative(); MyClass::nativeFunc1(env, obj); MyClass::nativeFunc2(env, obj); MyClass::nativeFunc3(env, obj); call transNativeToJava(); }

62

Page 63: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

63 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Java

Java Heap

Native Memory

VM

Native

Thread State

Page 64: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

64 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Java

Java Heap

Native Memory

VM

Native

Thread State

Page 65: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

65 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Better JNI

§ Native access between the JVM and native APIs –  Native code via FFIs –  Native data via safely-wrapped access functions –  Tooling for header file API extraction and API metadata storage

§ Wrapper interposition mechanisms, based on JVM interfaces –  add (or delete) wrappers for specialized safety invariants

§ Basic bindings for selected native APIs

Easier, Safer, Faster!

65

Page 66: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

66 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Native Data

Page 67: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

67 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

NIO @since 1.4

Page 68: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

68 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

NIO

§  Provides access to the low-level I/O operations –  Buffers for bulk memory operations

§  on-heap and off-heap –  Character set encoders and decoders –  Channels, a new primitive I/O abstraction –  File interface

§  supports locks and memory mapping of files –  Multiplexed, non-blocking I/O

“New I/O”

Page 69: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

69 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

java.nio.Buffer

§  java.nio.ByteBuffer / CharBuffer / … –  MappedByteBuffer extends ByteBuffer

§  memory-mapped region of a file –  DirectByteBuffer extends MappedByteBuffer

§  malloc’ed native memory –  HeapByteBuffer

§  backed by byte[]

Page 70: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

70 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

java.nio.DirectByteBuffer

ByteBufferdbb=ByteBuffer.allocateDirect(size);dbb.rewind();//resetpositionwhile(dbb.hasRemaining()){byteb=dbb.get();}

Usage

Page 71: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

71 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

java.nio.Buffer

§ < 2GiB –  ByteBuffer.allocateDirect(int size)

§ Stateful –  Buffer.position –  not thread-safe

§ Resource deallocation –  GC-based (Cleaner) memory management

§ Zeroing –  on initialization

§ Bounds checking

Page 72: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

72 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

sun.misc.Unsafe Anti-JNI

Page 73: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

73 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

sun.misc.Unsafe

Use case Example methods

Concurrency primitives compareAndSwap*

Serialization allocateInstance

Efficient memory management, layout, and access

allocateMemory/freeMemory get*/put*

Interoperate across the JVM boundary get*/put*

… …

Page 74: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

74 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

sun.misc.Unsafe

§ Unsafe.get*/put* –  getInt(Object base, long offset) –  putInt(Object base, long offset, int value);

§ double-register addressing mode –  getInt(o, offset) == o + offset –  getInt(null, address) == address

§  long allocateMemory(long size)

Page 75: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

75 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

sun.misc.Unsafe

§ Absolute addresses –  byte getByte(long address) –  int getInt(long address) –  …

§ Object getObject(long address)?

§  long getAddress(long address)

Page 76: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

76 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

UNSAFE.putInt(new Object(), 0L, 0)

Page 77: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

77 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

UNSAFE.putInt(null, 0L, 0)

Page 78: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

78 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

UNSAFE.getObject(addr)

Page 79: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

79 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Unsafe =? Fast

Page 80: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

80 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Unsafe != Fast

Page 81: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

81 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Unsafe != Fast

§ public native Object allocateInstance(Class<?> cls) throws …;

§ Array index vs raw offset long[]base=newlong[…];intidx=…;longoffset=(((long)idx)<<SCALE+OFFSET)longvalue=Unsafe.getLong(base,offset);

§  JDK-8078629: “VM should constant fold Unsafe.get*() loads from final fields”

Page 82: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

82 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

- How many of you have used the Unsafe API? …

John Rose, JVM Architect, Oracle JVM Language Summit 2014

82

Page 83: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

83 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

- How many of you have used the Unsafe API? …

- A lot of you. Gosh. I'm sorry.

John Rose, JVM Architect, Oracle JVM Language Summit 2014

83

Page 84: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

84 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Page 85: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

85 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

sun.misc.Unsafe

Use case Example methods

Concurrency primitives compareAndSwap*

Serialization allocateInstance (ReflectionFactory.newConstructorForSerialization)

Efficient memory management, layout, and access

allocateMemory/freeMemory get*/put*

Interoperate across the JVM boundary

get*/put*

Page 86: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

86 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

sun.misc.Unsafe

Use case Replacement

Concurrency primitives JEP 193 Variable Handles

Serialization Reboot JEP 187 Serialization Improvements

Efficient memory management, layout, and access

Project Panama, Project Valhalla, Arrays 2.0, Better GC

Interoperate across the JVM boundary

Project Panama, JEP 191 Foreign Function Interface

Page 87: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

87 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

java.lang.invoke.

VarHandle @since 9

JEP 193: Variable Handles

Page 88: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

88 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

VarHandle

MethodHandles.Lookup:VarHandlebyteBufferViewVarHandle(Class<?>viewArrayClass,booleanbigEndian){…}

“Produces a VarHandle giving access to elements of a ByteBuffer viewed as if it were an array of elements of a different primitive component type to that of byte, such as int[] or long[].”

ByteBuffer View

Page 89: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

89 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

VarHandle

VarHandleVH=MethodHandles.byteBufferViewVarHandle(int[].class,ByteOrder.nativeOrder()==ByteOrder.BIG_ENDIAN);ByteBuffer dbb = ByteBuffer.allocateDirect(size); int v = (int)VH.get(dbb, idx);

ByteBuffer View

Page 90: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

90 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

java.nio.ByteBuffer vs VarHandle View

DirectByteBuffer VarHandle Size < 2 GiB < 2 GiB State Yes No Resource management GC-based No (delegates to DBB) Zeroing Yes No (delegates to DBB) Bound checks Yes (optimized) Yes (optimized)

Page 91: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

91 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Optimized Bounds Checks

//nullcheck+(indexu<array.length)returnarray[index];

int[]

Page 92: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

92 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Optimized Bounds Checks

//boundsandnullcheckif(index<0||index>=array.length)thrownew…();longoffset=BASE+(((long)index)<<2);returnUNSAFE.getInt(array,offset);

int[]

Page 93: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

93 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Optimized Bounds Checks

//boundsandnullcheckindex=Objects.checkIndex(index,array.length);longoffset=BASE+(((long)index)<<2);returnUNSAFE.getInt(array,offset);

@HotSpotIntrinsicCandidatepublicstaticintcheckIndex(intindex,intlength,…);

int[]

Page 94: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

94 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

“Если не Unsafe, то кто: восход VarHandles”

Алексей Шипилёв, Oracle

Сегодня, 17:20, Зал №1

Page 95: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

95 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

§ Existing –  Java Native Interface (JNI) & JNR library –  java.nio.DirectByteBuffer –  sun.misc.Unsafe (get*/set*)

§  JDK9 –  j.l.i.VarHandle views over ByteBuffers

§ Future –  Project Panama

Page 96: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

96 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

http://openjdk.java.net

Project Panama Foreign Function Interface Data Layout Control Vector API Arrays 2.0

Page 97: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

97 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

http://openjdk.java.net

Project Panama [email protected]://hg.openjdk.java.net/panama/panama

Page 98: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

98 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Safe Harbor Statement

The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

Page 99: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

99 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Graphic Section Divider

Page 100: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

100 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Vector API

bits Java x86 reg 8 byte al 16 short ax 32 int eax 64 long rax 128 - xmm0 256 - ymm0 512 - zmm0

Page 101: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

101 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Vector API

§ MIMD (SPMD), SIMD, SIMT (GPGPU)

Page 102: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

102 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI Usage scenario

Page 103: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

103 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI

Java: public class GetPid { public static native long getpid(); }

C/C++:

get_pid.h: JNIEXPORT jlong JNICALL Java_GetPid_getpid (JNIEnv *, jclass); get_pid.c: jlong JNICALL Java_GetPidJNI_getpid(JNIEnv *env, jclass c) {

return getpid(); }

Page 104: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

104 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

JNI: Method Invocation

1.  if (GC_locker::needs_gc()) SharedRuntime::block_for_jni_critical()

2.  transition to thread_in_native 3.  unpack array arguments

4.  call native entry point

Runtime checks before and after native call

1.  call native entry point 2.  check for safepoint in progress

3.  check if any thread suspend flags are set –  call into JVM and possibly unlock the

JNI critical if a GC was suppressed while in the critical native

4.  transition to thread_in_Java

5.  return

Page 105: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

105 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

§  Java Heap § Native Heap

Page 106: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

106 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

§ Panama –  Vector API –  Arrays 2.0 –  Layout

Page 107: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

107 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Java

Code

Data

Native

Code

Data

Page 108: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

108 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

GC roots

Java Heap Native Memory

Page 109: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

109 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

GC roots

Java Heap Native Memory

Page 110: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

110 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

GC roots

Java Heap Native Memory

Page 111: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

111 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

java.nio.ByteBuffer

public final ByteBuffer alignedSlice(int unitSize) { /** * Creates a new byte buffer whose content is a shared and aligned * subsequence of this buffer's content.

public final int alignmentOffset(int index, int unitSize) {

§  /** * Returns the memory address, pointing to the byte at the given index, * modulus the given unit size. * * @apiNote * This method may be utilized to determine if unit size bytes from an * index can be accessed atomically, if supported by the native platform. *

@since 9

Page 112: Working with Native Libraries in Java - JUG Ru Grouppublic.jugru.org/.../2016_NativeCode_JPoint_Ivanov.pdf– Native types are unsafe, so trusted code must manage the bits § Solution

112 Copyright © 2016, Oracle and/or its affiliates. All rights reserved

Java

Code

Data

Native

Code

Data