package Ġfr . ac in q . secp 2 5 6 k 1 . jni Ċ Ċ import Ġfr . ac in q . secp 2 5 6 k 1 . Sec p 2 5 6 k 1 Ċ import Ġfr . ac in q . secp 2 5 6 k 1 . Native Sec p 2 5 6 k 1 Ċ import Ġjava . io .* Ċ import Ġjava . util .* Ċ Ċ /** Ċ * ĠSet Ġthe Ġsystem Ġproperties , Ġorg . sqlite . lib . path , Ġorg . sqlite . lib . name , Ċ * Ġappropriately Ġso Ġthat Ġthe ĠSQLite ĠJDBC Ġdriver Ġcan Ġfind Ġ*. dll , Ġ*. j nil ib Ġand Ċ * Ġ*. so Ġfiles , Ġaccording Ġto Ġthe Ġcurrent ĠOS Ġ( win , Ġlinux , Ġmac ). Ċ * ĠThe Ġlibrary Ġfiles Ġare Ġautomatically Ġextracted Ġfrom Ġthis Ġproject 's Ġpackage Ġ( JAR ). Ċ * Ġusage : Ġcall Ġ[. initialize ] Ġbefore Ġusing ĠSQLite ĠJDBC Ġdriver . Ċ * Ċ * Ġ@ author Ġleo Ċ */ Ċ public Ġobject ĠNative Sec p 2 5 6 k 1 Jvm Loader Ġ{ ĊĠĠ Ġprivate Ġvar Ġextracted Ġ= Ġfalse ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠLoads Ġse cp 2 5 6 k 1 Ġnative Ġlibrary . ĊĠĠĠ Ġ* ĊĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġse cp 2 5 6 k 1 Ġnative Ġlibrary Ġis Ġsuccessfully Ġloaded ; Ġfalse Ġotherwise . ĊĠĠĠ Ġ* Ġ@ throws ĠException Ġif Ġloading Ġfails ĊĠĠĠ Ġ*/ ĊĠĠ Ġ@ Jvm Static ĊĠĠ Ġ@ Synchron ized ĊĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠ Ġpublic Ġfun Ġload (): ĠSec p 2 5 6 k 1 Ġ{ ĊĠĠĠĠĠĠ Ġ// Ġonly Ġcleanup Ġbefore Ġthe Ġfirst Ġextract ĊĠĠĠĠĠĠ Ġif Ġ(! extract ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġcleanup () ĊĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġload Sec p 2 5 6 k 1 Native Library () ĊĠĠĠĠĠĠ Ġreturn ĠNative Sec p 2 5 6 k 1 ĊĠĠ Ġ} ĊĊĠĠ Ġprivate Ġval Ġtemp Dir : ĠFile ĊĠĠĠĠĠĠ Ġget () Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠ ĠSystem . getProperty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fr . ac in q . secp 2 5 6 k 1 . tmpdir ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . getProperty (" java . io . tmpdir ") ĊĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠ Ġ) ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠDeleted Ġold Ġnative Ġlibraries Ġe . g . Ġon ĠWindows Ġthe ĠDLL Ġfile Ġis Ġnot Ġremoved ĊĠĠĠ Ġ* Ġon ĠVM - Exit Ġ( bug Ġ# 8 0 ) ĊĠĠĠ Ġ*/ ĊĠĠ Ġ@ Jvm Static ĊĠĠ Ġpublic Ġfun Ġcleanup () Ġ{ ĊĠĠĠĠĠĠ Ġval Ġtemp Folder Ġ= Ġtemp Dir . absolute Path ĊĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( temp Folder ) ĊĠĠĠĠĠĠ Ġval Ġnative Lib Files Ġ= Ġdir . list Files ( object Ġ: ĠFilename Filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġsearch Pattern Ġ= Ġ" secp 2 5 6 k 1 -" ĊĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( dir : ĠFile , Ġname : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname . startsWith ( search Pattern ) Ġ&& Ġ! name . endsWith (". l ck ") ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠ Ġif Ġ( native Lib Files Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( native Lib File Ġin Ġnative Lib Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl ck File Ġ= ĠFile ( native Lib File . absolute Path Ġ+ Ġ". l ck ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! l ck File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnative Lib File . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Failed Ġto Ġdelete Ġold Ġnative Ġlib " Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠ Ġprivate Ġfun ĠInputStream . contents Equals ( other : ĠInputStream ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠ Ġval Ġbuf This Ġ= Ġthis Ġas ? ĠBuffered InputStream ĊĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠBuffered InputStream ( this ) ĊĠĠĠĠĠĠ Ġval Ġbuf Other Ġ= Ġother Ġas ? ĠBuffered InputStream ĊĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠBuffered InputStream ( other ) ĊĠĠĠĠĠĠ Ġvar Ġch Ġ= Ġbuf This . read () ĊĠĠĠĠĠĠ Ġwhile Ġ( ch Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġval Ġch 2 Ġ= Ġbuf Other . read () ĊĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ch Ġ!= Ġch 2 ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠ Ġch Ġ= Ġbuf This . read () ĊĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġval Ġch 2 Ġ= Ġbuf Other . read () ĊĠĠĠĠĠĠ Ġreturn Ġch 2 Ġ== Ġ- 1 ĊĠĠ Ġ} ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠExtract s Ġand Ġloads Ġthe Ġspecified Ġlibrary Ġfile Ġto Ġthe Ġtarget Ġfolder ĊĠĠĠ Ġ* ĊĠĠĠ Ġ* Ġ@ param Ġlib Dir ĠLibrary Ġpath . ĊĠĠĠ Ġ* Ġ@ param Ġlib FileName ĠĠĠĠĠĠ ĠLibrary Ġname . ĊĠĠĠ Ġ* Ġ@ param Ġtarget Directory ĠĠĠĠĠĠĠĠĠ ĠTarget Ġfolder . ĊĠĠĠ Ġ* Ġ@ return ĊĠĠĠ Ġ*/ ĊĠĠ Ġprivate Ġfun Ġextract And Load Library File ( lib Dir : ĠString , Ġlib FileName : ĠString , Ġtarget Directory : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠ Ġval Ġlib Path Ġ= Ġ"$ lib Dir /$ lib FileName " ĊĠĠĠĠĠĠ Ġ// ĠInclude Ġarchitecture Ġname Ġin Ġtemporary Ġfilename Ġin Ġorder Ġto Ġavoid Ġconflicts ĊĠĠĠĠĠĠ Ġ// Ġwhen Ġmultiple ĠJVM s Ġwith Ġdifferent Ġarchitectures Ġrunning Ġat Ġthe Ġsame Ġtime ĊĠĠĠĠĠĠ Ġval Ġuuid Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠ Ġval Ġextracted Lib FileName Ġ= ĠString . format (" secp 2 5 6 k 1 -% s -% s ", Ġuuid , Ġlib FileName ) ĊĠĠĠĠĠĠ Ġval Ġextracted L ck FileName Ġ= Ġ"$ extract ed Lib FileName . l ck " ĊĠĠĠĠĠĠ Ġval Ġextracted Lib File Ġ= ĠFile ( target Directory , Ġextracted Lib FileName ) ĊĠĠĠĠĠĠ Ġval Ġextracted L ck File Ġ= ĠFile ( target Directory , Ġextracted L ck FileName ) ĊĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExtract Ġa Ġnative Ġlibrary Ġfile Ġinto Ġthe Ġtarget Ġdirectory ĊĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠNative Sec p 2 5 6 k 1 Jvm Loader :: class . java . getResource AsStream ( lib Path ) ĊĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! extract ed L ck File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( extract ed L ck File ). close () ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠFileOutputStream ( extract ed Lib File ) ĊĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 8 1 9 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbytes Read Ġ= Ġreader . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( bytes Read Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ( buffer , Ġ 0 , Ġbytes Read ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Read Ġ= Ġreader . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete Ġthe Ġextracted Ġlib Ġfile Ġon ĠJVM Ġexit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextracted Lib File . delete On Exit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextracted L ck File . delete On Exit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . close () ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġexecutable Ġ( x ) Ġflag Ġto Ġenable ĠJava Ġto Ġload Ġthe Ġnative Ġlibrary ĊĠĠĠĠĠĠĠĠĠĠ Ġextracted Lib File . set Readable ( true ) ĊĠĠĠĠĠĠĠĠĠĠ Ġextracted Lib File . set Writable ( true , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠ Ġextracted Lib File . set Executable ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġwhether Ġthe Ġcontents Ġare Ġproperly Ġcopied Ġfrom Ġthe Ġresource Ġfolder ĊĠĠĠĠĠĠĠĠĠĠ ĠNative Sec p 2 5 6 k 1 Jvm Loader :: class . java . getResource AsStream ( lib Path ). use Ġ{ Ġnative In Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileInputStream ( extract ed Lib File ). use Ġ{ Ġextracted Lib In Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! native In . contents Equals ( extract ed Lib In )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġwrite Ġa Ġnative Ġlibrary Ġfile Ġat Ġ% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextracted Lib File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠ Ġload Native Library ( target Directory , Ġextracted Lib FileName ) ĊĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println ( e . message ) ĊĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠLoads Ġnative Ġlibrary Ġusing Ġthe Ġgiven Ġpath Ġand Ġname Ġof Ġthe Ġlibrary . ĊĠĠĠ Ġ* ĊĠĠĠ Ġ* Ġ@ param Ġpath ĠPath Ġof Ġthe Ġnative Ġlibrary . ĊĠĠĠ Ġ* Ġ@ param Ġname ĠName Ġ Ġof Ġthe Ġnative Ġlibrary . ĊĠĠĠ Ġ* Ġ@ return ĠTrue Ġfor Ġsuccessfully Ġloading ; Ġfalse Ġotherwise . ĊĠĠĠ Ġ*/ ĊĠĠ Ġprivate Ġfun Ġload Native Library ( path : ĠString , Ġname : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠ Ġval Ġlib Path Ġ= ĠFile ( path , Ġname ) ĊĠĠĠĠĠĠ Ġreturn Ġif Ġ( lib Path . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load ( File ( path , Ġname ). absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn satisfied Link Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Failed Ġto Ġload Ġnative Ġlibrary :$ name . Ġos info : Ġ${ OS Info . native Suffix }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠLoads Ġse cp 2 5 6 k 1 Ġnative Ġlibrary Ġusing Ġgiven Ġpath Ġand Ġname Ġof Ġthe Ġlibrary . ĊĠĠĠ Ġ* ĊĠĠĠ Ġ* Ġ@ throws ĊĠĠĠ Ġ*/ ĊĠĠ Ġprivate Ġfun Ġload Sec p 2 5 6 k 1 Native Library () Ġ{ ĊĠĠĠĠĠĠ Ġif Ġ( extract ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠ Ġ// ĠTry Ġloading Ġlibrary Ġfrom Ġfr . ac in q . secp 2 5 6 k 1 . lib . path Ġlibrary Ġpath Ġ*/ ĊĠĠĠĠĠĠ Ġval Ġlibrary Path Ġ= ĠSystem . getProperty (" fr . ac in q . secp 2 5 6 k 1 . lib . path ") ĊĠĠĠĠĠĠ Ġval Ġlibrary Name Ġ= ĠSystem . getProperty (" fr . ac in q . secp 2 5 6 k 1 . lib . name ") Ġ?: ĠSystem . map Library Name (" secp 2 5 6 k 1 - jni ") ĊĠĠĠĠĠĠ Ġif Ġ( library Path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( load Native Library ( library Path , Ġlibrary Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextracted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠ Ġ// ĠLoad Ġthe Ġos - dependent Ġlibrary Ġfrom Ġthe Ġjar Ġfile ĊĠĠĠĠĠĠ Ġval Ġpackage Path Ġ= ĠNative Sec p 2 5 6 k 1 Jvm Loader :: class . java . get Package (). name . replace ("\\ .". to Regex (), Ġ"/") ĊĠĠĠĠĠĠ Ġval Ġembedded Library Path Ġ= Ġ"/ $ package Path / native /${ OS Info . native Suffix }" ĊĠĠĠĠĠĠ Ġval Ġhas Native Lib Ġ= ĠNative Sec p 2 5 6 k 1 Jvm Loader :: class . java . getResource ("$ embedded Library Path /$ library Name ") Ġ!= Ġnull ĊĠĠĠĠĠĠ Ġif Ġ(! has Native Lib ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġerror (" No Ġnative Ġlibrary Ġfound : Ġat Ġ$ embedded Library Path /$ library Name ") ĊĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠ Ġ// ĠTry Ġextracting Ġthe Ġlibrary Ġfrom Ġjar ĊĠĠĠĠĠĠ Ġif Ġ( extract And Load Library File ( embedded Library Path , Ġlibrary Name , Ġtemp Dir . absolute Path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġextracted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġextracted Ġ= Ġfalse ĊĠĠĠĠĠĠ Ġreturn ĊĠĠ Ġ} Ċ }