package Ġcom . kan aria čĊč Ċ import Ġcom . kan aria . exception . Not Loading J ni Exception č Ċ import Ġcom . kan aria . exception . Unsupported Platform Exception č Ċ import Ġorg . dom 4 j . Element č Ċ import Ġorg . dom 4 j . Node č Ċ import Ġorg . dom 4 j . io . SAX Reader č Ċ import Ġjava . io . File čĊč Ċ /** čĊ Ġ* Ġ å®Łè¡Į ä¸Ń ãģ® ãĥĹ ãĥ© ãĥĥãĥĪ ãĥķãĤ© ãĥ¼ãĥł ãģ« éģ© åĲĪ ãģĹãģŁ dll / so ãĤĴ JVM ãģ« èªŃãģ¿ è¾¼ ãĤĢ æ©Łèĥ½ ãĤĴ æıĲä¾Ľ ãģĹãģ¾ãģĻ . čĊ Ġ*/ č Ċ object ĠK an aria Loader Ġ{ čĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠJNI ãģ® èªŃãģ¿ è¾¼ ãģ¿ ãģĮ çµĤ äºĨ ãģĹãģ¦ãģĦãĤĭ åł´åĲĪ true ãģ«ãģª ãĤĬãģ¾ãģĻ . čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġvar Ġis Loaded : ĠBoolean Ġ= Ġfalse čĊĠĠĠĠĠĠĠ Ġprivate Ġset čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠJNI ãĤĴ èªŃãģ¿ è¾¼ ãĤĵ ãģ§ ãģĦ ãĤĭ ãģĭ ãĤĴ ãĥģ ãĤ§ ãĥĥãĤ¯ ãģĹãģ¾ãģĻ ãĢĤ čĊĠĠĠĠ Ġ* Ġ èªŃãģ¿ è¾¼ ãĤĵ ãģ§ ãģĦ ãģªãģĦ åł´åĲĪ ãĢģ ä¾ĭ å¤ĸ ãģĮ ãĤ¹ ãĥŃ ãĥ¼ ãģķãĤĮãģ¾ãģĻ ãĢĤ čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* Ġ@ throws ĠNot Loading J ni Exception Ġ[ load ] ãĥ¡ ãĤ½ãĥĥãĥī ãģ«ãĤĪ ãĤĬ åĪĿ æľŁ åĮĸ åĩ¦çĲĨ ãģĮ åĳ¼ ãģ° ãĤĮ ãģ¦ãģĦ ãģªãģĦ ãģ¨ ãģį ãģ« ãĤ¹ ãĥŃ ãĥ¼ ãģķãĤĮãģ¾ãģĻ ãĢĤ čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġinternal Ġfun Ġcheck OrThrow () Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ(! is Loaded ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Loading J ni Exception (" J ni Ġis Ġnot Ġloaded . ĠCheck Ġif Ġthe ĠK an aria Loader # load () Ġfunction Ġhas Ġbeen Ġexecuted .") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠJNI ãģ§ ä½¿çĶ¨ ãģĻãĤĭ ãĥ©ãĤ¤ ãĥĸãĥ© ãĥª ãĤĴ jar ãģĭãĤī åıĸ ãĤĬ åĩº ãģĹãģ¦ ãĤ« ãĥ¬ ãĥ³ãĥĪ ãĥĩãĤ£ ãĥ¬ ãĤ¯ãĥĪ ãĥª ãģ« éħįç½® ãģĹ ãĢģ JVM ãģ« èªŃãģ¿ è¾¼ ãģ¿ ãģ¾ãģĻ . čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġload () Ġ= Ġload ( File (". ")) čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠJNI ãģ§ ä½¿çĶ¨ ãģĻãĤĭ ãĥ©ãĤ¤ ãĥĸãĥ© ãĥª ãĤĴ jar ãģĭãĤī åıĸ ãĤĬ åĩº ãģĹãģ¦ [ expand Directory ] ãģ§ æĮĩå®ļ ãģķãĤĮãģŁ ãĥĩãĤ£ ãĥ¬ ãĤ¯ãĥĪ ãĥª ãģ« éħįç½® ãģĹ ãĢģ JVM ãģ« èªŃãģ¿ è¾¼ ãģ¿ ãģ¾ãģĻ . čĊĠĠĠĠ Ġ* Ġ@ param Ġexpand Directory Ġ ãĥ©ãĤ¤ ãĥĸãĥ© ãĥª ãĥķãĤ¡ãĤ¤ãĥ« ãģ® å±ķ éĸĭ åħĪ čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġload ( expand Directory : ĠFile ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( is Loaded ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġplatform Name Ġ= Ġfind Compatible Platforms () čĊĠĠĠĠĠĠĠ Ġval Ġload Path Ġ= Ġexpand Internal Library ( platform Name , Ġexpand Directory ) čĊčĊĠĠĠĠĠĠĠ ĠSystem . load ( load Path . absolute Path . toString ()) čĊĠĠĠĠĠĠĠ Ġis Loaded Ġ= Ġtrue čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġ ãĥªãĤ½ãĥ¼ãĤ¹ ãģ« åı İ ãĤģ ãĤī ãĤĮ ãģŁ platform . xml ãģĭãĤī Rust ãģ® ãĥĹ ãĥ© ãĥĥãĥĪ ãĥķãĤ© ãĥ¼ãĥł ãĤĴ æ¤ ľç´¢ ãģĻãĤĭ . čĊĠĠĠĠ Ġ* Ġplatform . xml ãģ¨ ãģ¯ ãĢģ Rust ãģ® ãĥĹ ãĥ© ãĥĥãĥĪ ãĥķãĤ© ãĥ¼ãĥł ãģ¨ Java ãģ® [ System . getProperty ] ãģĭãĤī åıĸå¾Ĺ ãģ§ãģįãĤĭ os . name ãģ¨ os . arch ãģ® åĢ¤ çŃī ãĤĴ ãĥŀ ãĥĥ ãĥĶ ãĥ³ãĤ° ãģĹãģŁ ãĥķãĤ¡ãĤ¤ãĥ« ãģ® ãģĵãģ¨ . čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* Ġ@ see ĠSystem . getProperty čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġfun Ġfind Compatible Platforms (): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠK an aria Loader . java Class . getResource AsStream (" platform . xml ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠRuntimeException (" platform . xml Ġis Ġnot Ġincluded .") čĊĠĠĠĠĠĠĠ Ġval Ġdocuments Ġ= ĠSAX Reader (). read ( inputStream ) čĊĠĠĠĠĠĠĠ Ġval Ġarch Ġ= ĠSystem . getProperty (" os . arch ") čĊĠĠĠĠĠĠĠ Ġval Ġos Ġ= Ġget Family () čĊčĊĠĠĠĠĠĠĠ Ġval Ġselect Os Ġ= Ġdocuments . select Nodes ("/ platform Mapping / os ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Node Sequence () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . attribute Value (" name - prefix ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . split ("| ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . any Ġ{ Ġstr Ġ-> Ġstr . startsWith ( os ) Ġ} Ġ?: Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () Ġ?: Ġthrow ĠUnsupported Platform Exception ( os , Ġarch ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġselect Arch Ġ= Ġselect Os . select Nodes ("./ arch ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Node Sequence () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . attribute Value (" type ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . split ("| ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . any Ġ{ Ġstr Ġ-> Ġstr Ġ== Ġarch Ġ} Ġ?: Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () Ġ?: Ġthrow ĠUnsupported Platform Exception ( os , Ġarch ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġselect Platforms Ġ= Ġselect Arch . select Nodes ("./ platform ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Node Sequence () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () čĊčĊĠĠĠĠĠĠĠ Ġval Ġtarget Platform Ġ= Ġselect Platforms čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġplatform Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplatform . select Nodes ("./ java - system - properties ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Node Sequence () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . attribute (" key ") Ġ!= Ġnull Ġ&& Ġit . attribute (" value ") Ġ!= Ġnull Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. all Ġ{ ĠSystem . getProperty ( it . attribute Value (" key ")) Ġ== Ġit . attribute Value (" value ") Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġselect Platforms . last OrNull () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠUnsupported Platform Exception ( os , Ġarch ) čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġtarget Platform . attribute Value (" name ") Ġ?: Ġthrow ĠRuntimeException (" Imp ossible ") čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠRust ãģ® ãĥĹ ãĥ© ãĥĥãĥĪ ãĥķãĤ© ãĥ¼ãĥł ãģ¨ åĲĮ ãģĺ åĲįåīį ãģ® ãĥĩãĤ£ ãĥ¬ ãĤ¯ãĥĪ ãĥª ãģ« åı İ ãĤģ ãĤī ãĤĮ ãģŁ dll / so ãĤĴ expand Path ãģ® ç® ĩ æīĢ ãģ« æĬ½ åĩº ãģĻãĤĭ . čĊĠĠĠĠ Ġ* Ġ ãģĿãĤĮ ãĤī ãģ® ãĥĩãĤ£ ãĥ¬ ãĤ¯ãĥĪ ãĥª ãģ«ãģ¯ ãĢģ ãĥĩãĤ£ ãĥ¬ ãĤ¯ãĥĪ ãĥª åĲį ãģ¨ åĲĮ ãģĺ ãĥĹ ãĥ© ãĥĥãĥĪ ãĥķãĤ© ãĥ¼ãĥł ãĤĴä½¿çĶ¨ãģĹãģ¦ ãĥĵ ãĥ« ãĥī ãģķãĤĮãģŁ dll / so ãģĮ åı İ ãĤģ ãĤī ãĤĮ ãģ¦ãģĦãĤĭ ãģ¯ ãģļ . čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* Ġ@ param Ġtoolchain Name Ġ[ find Compatible Platforms ] ãģĭãĤī åıĸå¾Ĺ ãģĹãģŁ Rust Tool chain ãģ® åĲįåīį čĊĠĠĠĠ Ġ* Ġ@ param Ġexpand Path Ġ å±ķ éĸĭ åħĪ ãĥĩãĤ£ ãĥ¬ ãĤ¯ãĥĪ ãĥª åĲį čĊĠĠĠĠ Ġ* Ġ@ see Ġfind Compatible Platforms čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġprivate Ġfun Ġexpand Internal Library ( toolchain Name : ĠString , Ġexpand Path : ĠFile ): ĠFile Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġj ni Stream Win Ġ= ĠK an aria Loader . java Class . getResource AsStream (" platforms /$ toolchain Name / kan aria _ jni ") čĊĠĠĠĠĠĠĠ Ġval Ġj ni Stream Pos Ġ= ĠK an aria Loader . java Class . getResource AsStream (" platforms /$ toolchain Name / lib kan aria _ jni ") čĊčĊĠĠĠĠĠĠĠ Ġval Ġ( inputStream , Ġfilename ) Ġ= Ġif Ġ( jni Stream Win Ġ!= Ġnull Ġ&& Ġj ni Stream Pos Ġ== Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( jni Stream Win , Ġ" kan aria _ jni . dll ") čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( jni Stream Win Ġ== Ġnull Ġ&& Ġj ni Stream Pos Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( jni Stream Pos , Ġ" lib kan aria _ jni . so ") čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 ãģ¤ ãģ® ãĥĩãĤ£ ãĥ¬ ãĤ¯ãĥĪ ãĥª ãģ« ä¸ ¡ æĸ¹ ãģ¯ ç½® ãģĭ ãģªãģĦ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Library Ġplacement Ġincorrect .") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġoutput FilePath Ġ= ĠFile ( expand Path . toString (), Ġfilename ) čĊĠĠĠĠĠĠĠ ĠinputStream . use Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput FilePath čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Stream () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ ĠoutputStream Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . copy To ( output Stream ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġoutput FilePath čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġget Family (): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġos Ġ= ĠSystem . getProperty (" os . name ") čĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġos Ġ== Ġnull Ġ-> Ġ"" čĊĠĠĠĠĠĠĠĠĠĠĠ Ġos . toLowerCase (). startsWith (" windows ") Ġ-> Ġ" windows " čĊĠĠĠĠĠĠĠĠĠĠĠ Ġos . toLowerCase (). startsWith (" mac ") Ġ-> Ġ" mac " čĊĠĠĠĠĠĠĠĠĠĠĠ Ġos . toLowerCase (). startsWith (" linux ") Ġ-> Ġ" unix " čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠList < Node >. as Node Sequence () Ġ= Ġthis . as Sequence () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠElement Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠElement Ġ} č Ċ }