/* Ċ ĠCopyright Ġ 2 0 1 4 ĠSmart sheet ĠInc . Ċ ĠCopyright Ġ 2 0 1 9 ĠSm JNI ĠContributors ĊĊ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat ĊĊĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 ĊĊ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ Ċ package Ġsm jni . jn igen Ċ Ċ import Ġjava . io . File Ċ import Ġjava . io . FileWriter Ċ import Ġjava . security . Digest InputStream Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . nio . file . Files Ċ import Ġjava . security . Message Digest Ċ import Ġjava . nio . file . Standard Copy Option ĊĊ Ċ internal Ġclass ĠGenerator Ġ{ ĊĊĠĠĠ Ġinternal Ġfun Ġgenerate ( type Map : ĠType Map , Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġgenerate Type Header ( type Map , Ġcontext ) ĊĊĠĠĠĠĠĠĠ Ġval Ġall Headers Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( header Ġin Ġtype Map . class Headers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( generate Class Header ( header , Ġtype Map , Ġcontext )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Headers . add ( header ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgenerate All Classes Header ( all Headers , Ġtype Map , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġgenerate Outputs List ( all Headers , Ġcontext ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Type Header ( type Map : ĠType Map , Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprint (" JN IG en : ĠGenerating Ġ${ context . header Name }: ") ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= Ġgenerate File ("${ context . dest Path }/${ context . header Name }") Ġ{ Ġtype Header Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguard Name Ġ= Ġ" HEADER _${ make Guard Name ( context . header Name )} _ INCLUDED " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Header . write ("# ifndef Ġ$ guard Name \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Header . write ("# define Ġ$ guard Name \ n \ n \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Header . write ("// THIS ĠFILE ĠIS ĠAUTO - GENERATED . ĠDO ĠNOT ĠEDIT \ n \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Header . write ("# include Ġ< sm jni / sm jni . h >\ n \ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexposed Classes Ġ= ĠArrayList ( type Map . ex posed Classes . values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexposed Classes . sortBy Ġ{ Ġit . cpp Name Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( class Content Ġin Ġexposed Classes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Header . write (" DEFINE _ JAVA _ TYPE (${ class Content . cpp Name }, Ġ Ġ\" ${ class Content . binary Name }\ ") \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Header . write ("\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( array Type Ġin Ġtype Map . ex posed Arrays . to Typed Array (). sorted ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Header . write (" DEFINE _ ARRAY _ JAVA _ TYPE ($ array Type )\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Header . write ("\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( class Content Ġin Ġexposed Classes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġclass Content . con verts To . sorted ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Header . write (" DEFINE _ JAVA _ CONVERSION (${ type Map . native Name Of ( item )}, Ġ${ class Content . cpp Name })\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Header . write ("\ n # endif \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( generated ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ġ Ġwritten ") ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ġ Ġup - to - date ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Class Header ( header : ĠString , Ġtype Map : ĠType Map , Ġcontext : ĠContext ) Ġ: ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( type Map . classes In Header ( header ). find { Ġit . java Entities . isNotEmpty () Ġ|| Ġit . native Methods . isNotEmpty () Ġ} Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġprint (" JN IG en : ĠGenerating Ġ$ header :") ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= Ġgenerate File ("${ context . dest Path }/ $ header ") Ġ{ Ġclass Header Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguard Name Ġ= Ġ" HEADER _${ make Guard Name ( header )} _ INCLUDED " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("# ifndef Ġ$ guard Name \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("# define Ġ$ guard Name \ n \ n \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("// THIS ĠFILE ĠIS ĠAUTO - GENERATED . ĠDO ĠNOT ĠEDIT \ n \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("# include Ġ\" ${ context . header Name } \"\ n \ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Map . classes In Header ( header ). forEach Ġ{ Ġclass Content Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Content . java Entities . isNotEmpty () Ġ|| Ġclass Content . native Methods . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Class Def ( class Header , Ġclass Content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("# endif \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( generated ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ġ Ġwritten ") ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ġ Ġup - to - date ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Class Def ( class Header : ĠFile Writer , Ġcontent : ĠClass Content ) Ġ Ġ{ ĊĊĠĠĠĠĠĠĠ Ġclass Header . write (" class Ġ${ content . cpp ClassName } Ġ: Ġpublic Ġsm jni :: java _ runtime :: simple _ java _ class < ${ content . cpp Name }> \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" {\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" public :\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġ${ content . cpp ClassName }( JNIEnv Ġ* Ġenv );\ n \ n ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( content . native Methods . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠ Ġvoid Ġregister _ methods ( JNIEnv Ġ* Ġenv ) Ġconst ;\ n \ n ") ĊĊĠĠĠĠĠĠĠ Ġgenerate Java Entity Accessors ( content . java Entities , Ġclass Header ) ĊĊĠĠĠĠĠĠĠ Ġclass Header . write (" private :\ n ") ĊĠĠĠĠĠĠĠ Ġgenerate Native Method Declarations ( content . native Methods , Ġclass Header ) ĊĠĠĠĠĠĠĠ Ġgenerate Java Entity Fields ( content . java Entities , Ġclass Header ) ĊĊĠĠĠĠĠĠĠ Ġclass Header . write (" }; \ n \ n \ n ") ĊĊĠĠĠĠĠĠĠ Ġgenerate Constructor Implementation ( content , Ġclass Header ) ĊĊĠĠĠĠĠĠĠ Ġgenerate Registration Method Implementation ( content , Ġclass Header ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Java Entity Accessors ( java Entities : ĠList < Java Entity >, Ġclass Header : ĠFile Writer ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfor ( java Entity Ġin Ġjava Entities ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Name Table Ġ= ĠName Table () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Names Ġ= ĠArrayList < Unique Name >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg Names . add ( arg Name Table . allocate Name (" env ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . allow Non Virt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg Name Table . allocate Name (" class For Non Virtual Call ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Entity . arg Names . map To ( arg Names ) Ġ{ Ġarg Name Table . allocate Name ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( java Entity . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJava EntityType . Method , ĠJava EntityType . Static Method , ĠJava EntityType . Constructor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠ Ġ${ java Entity . returnType } Ġ${ java Entity . name }( JNIEnv Ġ* Ġenv ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġjava Entity . arg Types . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ java Entity . arg Types [ i ]} Ġ${ arg Names [ i Ġ+ Ġ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Name Ġ= Ġ" m _${ java Entity . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ) Ġconst \ n ĠĠĠĠĠĠĠ Ġ{ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . returnType Ġ!= Ġ" void ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" return Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("$ member Name ( env ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . type Ġ== ĠJava EntityType . Static Method Ġ|| Ġ Ġjava Entity . type Ġ== ĠJava EntityType . Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ* this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġjava Entity . arg Types . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ arg Names [ i Ġ+ Ġ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ); Ġ}\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . allow Non Virt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠ Ġtemplate < typename ĠClass Type > Ġ${ java Entity . returnType } Ġ${ java Entity . name }( JNIEnv Ġ* Ġenv ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ java Entity . arg Types [ 0 ]} Ġ${ arg Names [ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġconst Ġjava _ class < ClassType > Ġ& Ġclass For Non Virtual Call ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġjava Entity . arg Types . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ java Entity . arg Types [ i ]} Ġ${ arg Names [ i Ġ+ Ġ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ) Ġconst \ n ĠĠĠĠĠĠĠ Ġ{ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . returnType Ġ!= Ġ" void ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" return Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("$ member Name . call _ non _ virtual ( env ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ arg Names [ 1 ]}, Ġclass For Non Virtual Call ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġjava Entity . arg Types . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ arg Names [ i Ġ+ Ġ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ); Ġ}\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJava EntityType . Field , ĠJava EntityType . Static Field Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Name Ġ= Ġ" m _${ java Entity . name }" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġ" get _${ java Entity . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠ Ġ${ java Entity . returnType } Ġ$ getter ( JNIEnv Ġ* Ġenv ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . arg Types . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ java Entity . arg Types [ 0 ]} Ġ${ arg Names [ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ) Ġconst \ n ĠĠĠĠĠĠĠ Ġ{ Ġreturn Ġ$ member Name . get ( env ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . type Ġ== ĠJava EntityType . Static Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ* this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . arg Types . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ arg Names [ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ); Ġ}\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! java Entity . is Final ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Ġ= Ġ" set _${ java Entity . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠ Ġvoid Ġ$ setter ( JNIEnv Ġ* Ġenv ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . arg Types . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ java Entity . arg Types [ 0 ]} Ġ${ arg Names [ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ java Entity . arg Types [ 1 ]} Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ java Entity . arg Types [ 0 ]} Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ) Ġconst \ n ĠĠĠĠĠĠĠ Ġ{ Ġ$ member Name . set ( env ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . type Ġ== ĠJava EntityType . Static Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ* this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Entity . arg Types . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġ${ arg Names [ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", Ġvalue ); Ġ}\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Java Entity Fields ( java Entities : ĠList < Java Entity >, Ġclass Header : ĠFile Writer ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( java Entities . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( java Entity Ġin Ġjava Entities ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( java Entity . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJava EntityType . Method Ġ-> Ġclass Header . write (" ĠĠĠ Ġconst Ġsm jni :: java _ method < ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJava EntityType . Static Method Ġ-> Ġclass Header . write (" ĠĠĠ Ġconst Ġsm jni :: java _ static _ method < ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJava EntityType . Field Ġ-> Ġclass Header . write (" ĠĠĠ Ġconst Ġsm jni :: java _ field < ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJava EntityType . Static Field Ġ-> Ġclass Header . write (" ĠĠĠ Ġconst Ġsm jni :: java _ static _ field < ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJava EntityType . Constructor Ġ-> Ġclass Header . write (" ĠĠĠ Ġconst Ġsm jni :: java _ constructor < ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ( java Entity . template Arguments . join ToString ( separator Ġ= Ġ", Ġ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Name Ġ= Ġ" m _${ java Entity . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("> Ġ$ member Name ;\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Native Method Declarations ( native Methods : ĠList < Native Method >, Ġclass Header : ĠFile Writer ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( native Methods . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( native Method Ġin Ġnative Methods ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠ Ġstatic Ġ${ native Method . returnType } ĠJNICALL Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("${ native Method . name } (" ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġnative Method . arguments . join ToString ( separator Ġ= Ġ", Ġ", Ġtransform Ġ= Ġ{ Ġarg Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg . second Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ arg . first } Ġ${ arg . second }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg . first ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("$ args );\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write ("\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Registration Method Implementation ( content : ĠClass Content , Ġclass Header : ĠFile Writer ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( content . native Methods . isNotEmpty ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" inline Ġvoid Ġ${ content . cpp ClassName } :: register _ methods ( JNIEnv Ġ* Ġenv ) Ġconst \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" {\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠ Ġregister _ n atives ( env , Ġ{\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( native Method Ġin Ġcontent . native Methods ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcpp Name Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( native Method . is Name Non Unique ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpp Name . append (" (${ native Method . returnType } Ġ( J NICALL Ġ*) (" ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Method . arguments . join To ( buffer Ġ= Ġcpp Name , Ġseparator Ġ= Ġ", Ġ", Ġtransform Ġ= Ġ{ Ġarg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpp Name . append (" )) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpp Name . append ( native Method . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( native Method . is Static ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠĠĠĠĠ Ġbind _ native (\" ${ native Method . name }\ ", Ġ$ cpp Name ), \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠĠĠĠĠ Ġbind _ native (\" ${ native Method . name }\ ", Ġ$ cpp Name ), \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠ Ġ}); \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (" }\ n \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Constructor Implementation ( content : ĠClass Content , Ġclass Header : ĠFile Writer ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġclass Header . write (" inline Ġ${ content . cpp ClassName } :: ${ content . cpp ClassName }( JNIEnv Ġ* Ġenv ):\ n ") ĊĠĠĠĠĠĠĠ Ġclass Header . write (" ĠĠĠ Ġsimple _ java _ class ( env )") ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( java Entity Ġin Ġcontent . java Entities ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Name Ġ= Ġ" m _${ java Entity . name }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( java Entity . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJava EntityType . Constructor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", \ n ĠĠĠ Ġ$ member Name ( env , Ġ* this )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Header . write (", \ n ĠĠĠ Ġ$ member Name ( env , Ġ* this , Ġ\" ${ java Entity . name }\ ") ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclass Header . write ("\ n {}\ n \ n ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate All Classes Header ( headers : ĠList < String >, Ġtype Map : ĠType Map , Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprint (" JN IG en : ĠGenerating Ġ${ context . all Header Name }: ") ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= Ġgenerate File ("${ context . dest Path }/${ context . all Header Name }") Ġ{ Ġall Header Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguard Name Ġ= Ġ" HEADER _${ make Guard Name ( context . all Header Name )} _ INCLUDED " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Header . write ("# ifndef Ġ$ guard Name \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Header . write ("# define Ġ$ guard Name \ n \ n \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Header . write ("// THIS ĠFILE ĠIS ĠAUTO - GENERATED . ĠDO ĠNOT ĠEDIT \ n \ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( header Ġin Ġheaders ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Header . write ("# include Ġ\"$ header \"\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Header . write ("\ n # define ĠJ N IG EN _ ALL _ GENERATED _ CLASSES Ġ\ \\ n ĠĠĠ Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Header . write ( headers . join ToString ( separator Ġ= Ġ", Ġ\ \\ n ĠĠĠ Ġ") Ġ{ Ġheader Ġ-> Ġtype Map . classes In Header ( header ). filter Ġ{ it . has CppClass Ġ}. map Ġ{ Ġit . cpp ClassName Ġ}. join ToString ( separator Ġ= Ġ", Ġ\ \\ n ĠĠĠ Ġ") }) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Header . write ("\ n \ n # endif \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( generated ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ġ Ġwritten ") ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ġ Ġup - to - date ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Outputs List ( headers : ĠList < String >, Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprint (" JN IG en : ĠGenerating Ġ${ context . output List Name }: ") ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= Ġgenerate File ("${ context . dest Path }/${ context . output List Name }") Ġ{ Ġout List Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġout List . write ("${ context . header Name }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout List . write ("${ context . all Header Name }\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( header Ġin Ġheaders ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout List . write ("$ header \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( generated ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ġ Ġwritten ") ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ġ Ġup - to - date ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate File ( name : ĠString , Ġgenerator : Ġ( FileWriter ) Ġ-> ĠUnit ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= ĠFile ( name ) ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġexisting . parent File ĊĠĠĠĠĠĠĠ ĠFiles . create Directories ( Paths . get ( dir . absolute Path )) ĊĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= ĠFile . create TempFile (" jn igen ", Ġnull , Ġdir ) ĊĠĠĠĠĠĠĠ Ġtemp . delete On Exit () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Writer ( temp ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Digest Ġ= Ġdigest File ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Digest Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Digest Ġ= Ġdigest File ( temp . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Digest !!. content Equals ( existing Digest )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . delete ( Paths . get ( existing . absolute Path )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . move ( Paths . get ( temp . absolute Path ), ĠPaths . get ( existing . absolute Path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStandard Copy Option . REPLACE _ EXIST ING , ĠStandard Copy Option . ATOMIC _ MOVE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdigest File ( path : ĠString ) Ġ: ĠByteArray ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmd Ġ= ĠMessage Digest . getInstance (" MD 5 ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . new InputStream ( Paths . get ( path )). use Ġ{ Ġstr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDigest InputStream ( str , Ġmd ). use Ġ{ Ġd str Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( d str . read ( buffer ) Ġ!= Ġ- 1 ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : Ġjava . nio . file . NoSuch File Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmd . digest () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Guard Name ( fileName : ĠString ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn ĠfileName . replace ( Regex (""" [- . ! @ #$ %^ & * ()+ \\ {}\ [\ ]; "? < >, ~ `] "" "), Ġ"_ "). toUpperCase () ĊĠĠĠ Ġ} Ċ }