From a44dfb36e67184eb2e2574393046304ea917ff9b Mon Sep 17 00:00:00 2001 From: lax1dude Date: Fri, 12 Apr 2024 23:20:09 -0700 Subject: [PATCH] improvements --- UnsafeMemcpy.dll | Bin 128000 -> 135168 bytes UnsafeMemcpy.jar | Bin 3504 -> 4874 bytes .../lax1dude/unsafememcpy/UnsafeArrays.java | 86 + .../lax1dude/unsafememcpy/UnsafeMemcpy.java | 388 ++-- .../lax1dude/unsafememcpy/UnsafeUtils.java | 5 + native/UnsafeArrays.c | 267 +++ native/UnsafeArraysImpl.h | 54 + native/UnsafeMallocImpl.h | 40 + native/UnsafeMemcpy.c | 1672 ++++++++++------- native/UnsafeMemcpyImpl.h | 68 +- 10 files changed, 1743 insertions(+), 837 deletions(-) create mode 100644 java/net/lax1dude/unsafememcpy/UnsafeArrays.java create mode 100644 native/UnsafeArrays.c create mode 100644 native/UnsafeArraysImpl.h create mode 100644 native/UnsafeMallocImpl.h diff --git a/UnsafeMemcpy.dll b/UnsafeMemcpy.dll index 0746243324e3feaefff27a3074cda7f115c39698..067de85c5547973cf78f05294c3760270706613a 100644 GIT binary patch literal 135168 zcmd>ne|%Hb`G3+RZGeWPNTeW0guseLs8+N!APJ;$11S^*MMXg?h!Yjt1W-|1(`v&d zlR3BP<|ZF?({1h}Zi;|9TMGTb&jKnSDxhxO7@P$Z3Mlvce$Kf!Kiag^((Uudmlx^1 z_uO-z^PJ~A=lOM>dv4)PD>XWeMx)11mNlBSIMP2S``hs!qgJEoJ$QX@%^N+oU9?u~ z-FDH81$UL&7M0w0XUT2%*otqv_ul(_w%g~~O8ocQ?z-3Jo_3w>p8M{YH_Bw{X;(mh zIp+O7FV0x+Qh)s#rnvry>wXO$*Zb@!xc(Q%BV*rl{(~L=;ruH*u5Q#?g#4EBsqOY3sQSWe@dd^WLr6t9<#b^TBXg~u^ zN@9nc)NaYVh4-N%(MaROeIt&>HuWZ;^#ALB&g+E0VVfXoJz`TqZnYrplUJ@aXf#4) zwLe=BbwbFxu0*R5#4U1B4hnsJy<#tK$gq(WHlf@lPhW%w0~>8O*KXaK3|@62yt|UY z^Zf{T4T4$6>u&%DIt9`2z$d^XccTz=+w-Cf=@E~_cv5T;Dv$ey zdd2gEklUW)T1WDM>f0FWe#p4-sim0mLZ$4#gtPCd`;v6e&n!(k;_iEj8^TMM#`@zC8^R0XuZwq5m2qm3N8CwOE{R^_ zKCXvFulapz?7AUrQ7=F=AvoJ^B#meD6t_UL3E~c^WeJ8yY$B7Zmmtoz=a4ZqrxxnV zOG;@=tPF#bl@>!b0iGb9^oVF7sH$NKL($GGm3c__RG=LK{KTaA%}j>h0#?`&erMoXD#P1F{NnwK z1j3EtgnMURJmH3O!tG#%gcx&EJo0UeKrMD2E+v!{=LP)-vtX3H#cq36c+q{h6`il# zByBxjxxCqegk~@0&CZH78yyL1o1o7ULg}z_XV{CR9@I>DxR z%?i~ajAW~*W^q(+y_cZqxZ%x&6WQGI$`%Hl&B%phy!-4;^cI=qbciZSev!<@LfCMoTn zb~!*9UsWEfOvs%g5*l9k=%gap(B{HjUw^w+<5HaU*$V%ohzpKZVw2AVVB?DQs1N7p zQuYja{gF2XAWRHS(e%oBP zsvRfcj(=Slp9KhCg21iD=RsE5#F#IE)MpNDTpOY|e@+l}~1ww6f5l#ekA?75kDa*em8X; zKhi$!;TJfJDGtkw`D_ckB=p=Oq_VuyNlyhf<|WK{Hs8rApsCc#-c;lpgxe?xx5s8j zg`00Imr1`yQA}@;O6Ss7k-Ct+kity3GvNzi$8cbhm+Ar&Mcy#`WSKpa$y-9DkhB4` z0%WC2gp~r7N+B~<qnR|%L?~o;Xle@6Pb&W0;-c{U00v6cCbx1L4NHI@ z5marGr)ZNs(l72HibPGhI-*+4l#3%-QDT$8kXRE;xXkYKDoWYrqOp$CFI^sQ?@dv9 z`IPa#5k)atbvWK!vBV)iS4IBEj5qX8m+@b5V;lURMNud5=Zfe56928U+TgzrMV-W- zE2jTT{L|aw-@o(tuVPZ+{}O-i4Q=RuBZ@jnf3Dd6FY#Y-eH;9rMNud5=Zdep@K5lE zCCFD6zu~SE3F}0Ec-KrqQZADh!3*qpm0s6ydi^yDlK5oe<3i(IaU$msg>=!o5BfvTDUCX9~>iAvH zQEp_V(K+EHOjYwsS1lAHfcBxF+aUzKZA0$|P}E6!w{Kr|H@#{7yA8cxD~utp(EA+}#UbAXdfWb^^#0x( zLs{YP9*HP-#NX}P!`)49S`TkS@9}ZSEA;lF=-lX?^B<-6iYaaA{Va;&Q0|D{s~K*| z?BDLDH|0yTq4$o-G2|6`e~h9y#Rzm2j6HIecx@E_ zsK4;!HH2w&p-Ax;o@J#!#$TxFdNfhF?BLQ5^9*kbmv*cWcUbFTV_oLs^x7 zi70o(FXuq$AL%b7wO{AB+t7Oo*f($Sd;jdlbbX-v$2eHv2Uxy~oC(tkBz&h;m2tZr^_GZh9xRUmta~ zq4x?Dog2M#T1oQml_y)BF_aa0??X`>${o>rb=L*=kCZ1;GW*pWhrGhy0~3+&0)J=y zN9jF#d>eY-g`!T<`;~L2cl-A1ECSwj`}MM`V?9&s*GVYiJ?pIf%5dm5`}Lb~F_cvK zhoU%QcfcPUmH(>!I=(Hw-gCyc+w9k*Dt*P+7>O16@hpnsNZgV9Xy1O#Y&8qdRX-+G zHai?K!kD^7>BY#?-7Y8cSP^1cI8J`=zSJ{A&P(0Uzl?h z5jW~D+|1V(?qa1;f1x0LeE~}gA$=tlKr~oqNL*xirb~V4tiKRNKHeC7KEDmWyo#c8 zf;gi70o( z-|gG4-A(VL_Up7UZRkB4MdwEEZnIyL()+o~V<;>1{u7GgQ0|D{?c1-Nrg!`H>)dm* zUrTahJyY!0Cs4$D)>-?N;m~dN>*zR?RQVT0>1_D}9F_m7{rc!-F%l~Hu0T;7b95j- z+QYZo?AN3!X6vOflofv7hoU%?JL2c|?N{4>!+tf#A+OMTU?TEepm(>~uSw}WJEsl3 z??O>0>D|8l+THX{D*T=w9YbEB_p2z1L%s|2ZY}w`Z2u*t_u)}7lvVo=MR6#1#NW@f zYh!nX-e>U_qWDMsh0zSt*8W0%BK~dtg-uEQg;ibZ%Q@Mv_gxYrzQQldP!vb}F7Qih z%6BinyfZR}vcfNoD2hY5BYx=`jl1G6B(-1V>=^P2z0(ts?*hHM&3=vYcf3pKjYC_G?mle>@_FvO@1LisDf2h`-yn zUpr0j_U+e2=VrhDEi2YD#eS_v5${=N?N^3Fx7n}v#i69izbHy)vtKzX|5f|-y`RKL zsNlO5MRCm00YA5gucehG*kyU0ROF?{p{($8|3s8K;^&p^>cpH@Sf8u>NE&~gHoOhJ zXQSxc=-qAhYf^eYH!Oy-LhnDJC=TV0=-s~k+THX{YQG+^$BD^K1T5<^*`cO#18Q0|D{ z?c0A{q4!z*g($y7{RR0V!nC!&&?6E5&iV_hyCfSs>n}u+k2eO#1Aq193uS(KS(l=V zBVCxEttsEV{IbFpLs{XMXHnEie(4&GyW%e-wO@A(jv=qm`(qTvA>Rdhcbom1ltl){ zp{&q*L?X%^&CmAj*VbIpuD);IeqBHlrtA3wM+e0QL(PA^P#uiU+OG_UZnIxsi$h7_ zk9SbiIsV|N{8#N)d0>o$3cl&*jIX7YCD>*8k#q`r<4{)k`9>7Qk+>s%UfHgU&T55q zyZlW1Jtgj^#51*9z2BGAetq(SHuQcDMRCY?AV1pU4`VCLyO-V{4~U_x&^wHxIFvi0 zch!H5-bwA(!Ewkd{5>)e`7Y4A+w9k*{JpS$8+t#0qE6Dgefzb$`8%oo`dVfTc~$&RJG? z6|UKMsGI(@+CPal=TZ0nJCAXWvh7|DPh^|L3W;&ZT;;pE(%uSu^9bz!$hLpHidu=@ zkKgNn@NCn5tNl2Y_BZuO(*9mnn52F5j_p6m+FyU(S=&#vhiu9AJ7{Ly&Sp|Jws*kG z;EyGsj@nsLO1LFFDrgx}eIK(82iy!GwZV zms<-HZ*K+sjLbL)fS+(pb7Je(`SZ<#D`-_$BREX1hqaoc{ysuYjb;9c8d*N-PdQpE z)HGVcFXPKLsEs{VvMP7^@&jLKeOdJ9{J<%#uO}NCIH*~*(sFF188JvV<6vG>&B`#> z=@>Snk;2Mq^Dk@IC43Ps6WAVwv@uw856Pom@knl?bP7N!s{NVj{=000Ol+1#n^)3) zjM6>e=H+{<+;*q)Ep1@j$>jiPu6zUS)EmOMAdZpNqEbb*Z<^Gv7p{)tZ3n48&4Q5i zh2PV`^biix)fZ|s5JDrQnY_9U_iy6&r_lXB4kDmW11N1zzC{|)17{Vox$89DFDR4QG1Ay7lysN8ApU_ll;Yztcdu?34|Es?cf}?ZOuT z!a8(UBMk$Xl{7NSd{kadvN@L@5e-Z6K<@s^>PP#;(ZosQm{Th^1P!xrU%CNZbS`fJ zS@Hto{uun%*w0{6Usu zx1No^b>y^qDs!io$GRU(PJOrUi88X7-(9{oA&iqZ^+hr(Qu{gGX!Lv9}-Jx zb6{MXz7cq`9@Plx9-&!U__H|?$OT?kwq{3hkEG`Ar@MSJ?WGtGr|Z@^*f2CYhRPn` zVvG0@HtNQt@f)PK!4%kiM%<0PzPZ|p?f@Hp@{BBl=Bmuvm)j^?-v$k!0cGo-aUxsa zV3!T+d+0SZ&uljf@~~H^47eVj2L|e1iOz{!(%txMAxF>?{o+n?5IvPojA`zQN7_zxmH81)*D)IMnhR|NI@++ zTMKT{2zOW0#5#q$LcLx~%pWTkO&={Kz+SygEz}C4>0PxD58n7&AdZh{$>+D^5x$Ex2YI3jvI};jcgq!Z6;+s z^lL)m?H0l%G=uF}j18e=>rN`i;9MpI?y%?Ko)^{x>2EK#^hN(*{nS(8T)N20ZDe3& z>kACrY-|__Mq|4Z#lEG2)=Js!zf)_uGHpDCCg+03Wb188d-<{U_@rXU_hH*H`S{SuJz?aN*`aLKdT=$50_?-K&^GSRETOxbz` zL#hCK1s7Oks|{CTwQwn&r}Ohrp^aaE`zzclu;DR_P;<~GC|8ZkrG06Jt@$n;lShx?Mu4jEp@ zIqE1!@S5}`nh^pn4)Z z{(oOa^D?V;wKj5s@|Z#&bKY0{f0jU0}9UiuQZq~D`hDWvDy#^!A7y8+E4 zpTg1?zz$OH{J?3gKZ6NPLEMJ#`l#cGO{}q9bde&p5;iIiJNtpA)Ys=35T6CaUP___ zvs1h|}k0fTOkj^I;f@%_9Fn6heiV9RBnd5s|#4_7w6O>@!guB|c*#kEuigG4Il z1_Du_ue5h4qd*VPYZJ;NUoEc%EcPiaE=QeZ<0MRVjkwQTxf;L%C$;7$Uc-s>ot}+o zR^@)b9oTM0Ehz(-f&_&9F1psTYhNkaS}KUv^L<*)Iwu|$Hv|rj&u$O`4YIJiLCD>} zch81O%Q9Qs*td(6+flOxv)PvZ)YW($)g{m> z8?qt?a(4;P^o;0%2kn}N>8vN1JQc?j#`DbVW#guyM6-OKPhYXi-y4>d8^p%p2lSNnnnn@x^W+N5)4;GBsdg>n;h93{Rl5@^ zUnoCZjoRWqt_~J1XCtZ?w`?1+4()5CO_<2QJXF~1THA#2mgswSbSYaWJcTpycM_@z zpk42peZ0*PXi{5D$-!VEj`_n;rV@S|R?~#fUpR+enE9D!BWVgUaV6^1Ed1%mXBZen5 zZYvHEwuL+Ib;J2MsL#I4pIz1JSxr07ZXh0pEV4vDxnRkK zS<$$No7uUI^@epgr+%AXaEmp$vKv9A^5%Pe^A@_wk4&0(uiq{15}R`yLzA=xy&B9f zxXO>-b?-b+P;W2jwHc80ZgC$5!x)@lPxoVEVv`T>kYrc3GsN)@HEbx$Lnpr^8yXF zdc(uG#0cZYLpY-`%ObylHXaUaw7_!6tBf+qmg!pAW#KH-|-n(4aUrC2fHLi(%> zHY9BEieE`Dfu9S-JB@|nl^$_UUSamP#|!lHUE&hKT=_8?BrrMT(&agF%>i=D#500U z7Tu@yUPrU}G1{dW7e=}Wz&O_gmYud}%oUh!begX9^~3FSV&WW+Zlg#1KyIq6Ui$DO zzVe4P#ijQg^uvZ5=K^zUd>2AO=iyA+|2UiTz1Oob6Sv9Mi%=|jPg`8f$@1vngMT2s z0aAIyNih01i8D@HJmNODSg7&n-lzG4Pd811sR$~|*1zDp1kxJRmg~Y}NP1LQtNA}%$9ukMIZD{Y5mR)L?Djfa2&AFm4k5#o`+`;EP<0hmZZ)Bi1ULdd9^+ys!(_?DDMB zD*wFZ*EV|sEf(|RM=_N1J?49B=9}kMd&*nNaJ|G5zMG0;@XhOoZF~>{qvTiS46Rp( zAV-Zw2pnqmX4e#A;?#uGd}C2P8gDU=(3(fMEJAq=!Nch){8oG9MjWc~Yr^l~eEezl zzwZege3S#x`_3~DrUx`=g_^(v{%>*L>`R?s&Twm+(Ye|)6&lTH{C-lY(VW0hk7Hl_ z?D&0)>ybDb@pIyrgP#UJ3w}2InsHyikv`rNG7W!7mM4l8hvu&o zg42%#r=Of3oc=@Abh(zUzYR|R9&%**2`a$xSaAAjIyDb=17>jg(ctt`sDB3cEcBZn zEHYLV^;GY(YbqB|u0*b4^dg-K?{tPe(~bFQ@zmGY48Q0fG4kP_zfyfbjc3s{+>(b^ zpy`nHsgqEAjt#z{aaMbf>0XCmDM=L^f^l)$Iul5-Z3JwM%0}P3su|ErV8HTxCUK?* z9>~=Dr-&}wCDd@BC1uIgg6Lu&S{Wl07wHigGYh)ud4lN4l12eie5W}Z1NCObKVs&Hj0Qk#yLHeJR zeYrFldrPaq|H{ z_EYo*!423NZv_eLbd-uM(kYs-fz5L6aiU}?2?m28Hb?FfO`}mm8iF=acGG(J;u>gA zOxbB@O*Cb2wCDkRT&hVr2|zd>DAZTO9+86+mkPl^8S0a45kDoECegHi0fJq-q^;B{ z5bsN%cF5L|KuHkm6yGEI%`{HCkZBztO4YD)gNEM#K%hnTjmG%@9^NSg7|9&8oT;{K zI741*&>-Ug6E;mkBO1kTBmTkgi>7M{4oICYtp?nH$%ShNLIOtW>iVVWAJw(;F01yFdkgZdoQe;yI zr5N!8tbJw|xANuU^fvU=NpEP(?Mr02P(0)jCFt%c;)*kwniNEytk>R&z6W;5E^&iL z+$H4hgeSASLD;=naO^Qx+>8N)p-)`1AzXxuLdQmP#XitS^g}p2cbq=QO)SQhz2xd$PKHSY3o?yrN+^Zm)NudrnTHRXwSSY;l- zg$uoqVm>}ZXaWdo$5e1^u0slw{hZr~k41k&4oS$`jDw^jTOJ)V16eks5#IPUp$tG2 z49tc-1Rm!6iBF$}Ogr%yo0ov}E{F6Fg0zmpo?8f3y87_cI6$YM4HDoyOK>n1G=Njd z;XF=o?r#exH4e@T3{IS{A$|m;?!c2+iVIn9Ca9P!1a%UD8^WTuyTu)ZnNhZ`M~5Qt zL~aM1I0uC0DW3zX9CL}y06dfcqXk1BoIv%X2@5p=DTVmK_vkVruMBoCw^%1zZ&tuZ zDpc^%cr4Q;FlUYMi$=op$LuVmg99IxH1xUyXBRXICw2x78IB2mq3?M>eZg+Y=br=* z4LVqgDq=4Z?NBKYCFsSg)J$L~e(i3# z(8S!L@rXx{y>zQ;(kS);>>01Pi!7MMci^vW@zp~1&QjBqklq5dVt#BSNUaz%=Evt? zG-1H#N?^d41OJ2B9(kUO75r26so9b;0bz`kW*8o@G`!koL9D5b-NzM(e!PV2g%#!f zU^#kpjq;(nIC&Jm+wi*&zgO@hv$7h$Cj1uQr-7wy!EYtbZ8%Ce=HOU_UnS0&{ZMOu ztLJ>IaS38i0S8>U&1)v4pvYb2OsO@m>4^oiW9Iu(j+r0T)Xrb&6;sS_O*W#^u0L!7K zEA6eBY(!a=V2rh|G+j&h;5q&XwXec?3t<)p2ki;~q|!U?K5)3UcU&cRRZ;I+vqhhw zn3=BQwPx6bS%^X%YNm2B46)qTD`tC|E1*5d%53&JO!wcW)hzB8-hh(W_>sA39^qln zW1KVMEYmWSuS7H}V-?*{Y}8dKTup`5R7lopHA;(LOXa3)oa30hH<3E_b)VF3K5VlYsj@Oud{lN5` z=D3IEGmMDF6=v6}2LA#W`4JO_)XivbF^}lMU=W@Mh4OG2ACpBO++4a*L^qt=2Pi_J zlL~XF&<0xOpu|Qc7PBQi!~ef10w#>SDnSRtjVJjBVN}&;kdM&J$Z5nPb5G(7Ok#2r zAUhNP#hxeIhiq>6@iXjsWOF+O5%HiJspMPGq)GZM4)pCoELgzi?c-VtDr%&eR7!>| zhua=J`rMY&4e$b-X97BiL8G8mljMqntbjdpOa&WWVqtnM{H1a%&fwR-xq65*)4Nt|gBHw!aQZ4)`WAnbN9`W8YI!7lqM?cv89+@j)^>xqU^(yFj)Z zTn>;n^z&*wO?a5{^GLr}L;P>>AM;@S1!{GdATEV#BKsPJfNbzX6giEdN#BPN8iQt% zwdRVG^tgC82wG|s7wH3MjONNFDht%)06N+F5r{PxqQh`_9h?2f%JU$ztHn|a7dqv6 z5aZRpCFOZf(s6!y9-gW8%`B&=O|{Qmo(HX5?aM9CgOyY58&aP4MhcD@<#})7=$}?U z(E@my$Tc_tBu!)-PGACPBA4T2Ih|zV1nN{18G@5?I_ZxS=yOfPf|CH9q~YW-oUl>2 z^AXqv*IC$_qP!!@@Z3^-;B1kN1Ln%Cd3v*>$8n{0%i+@8J|yXZ;g~ zH&F^ZR}jQ;KZPkT?g@N0J~YLdy%~%`>lCnDOwXbYxtIfl+>?k$?Z)@4!J$(gX6%%^ z3;6CqaP2P(VbP|$90y=uhfHtcN}`p}m4JR8Y^n-WNBJ!{NM*39P=p{I6_rrYJt)E= z&J~2tahKU$UuB^0u18X(0DP^LyeA{klgi`%9@M{q=m8vemZL-yqV?C&RC`v+hU1L< ziY(^Q&&5;X%6IU$<}2gz4Oq599Q;8V?FMnTY<&`^@FCNw7FN)U9%3Sc&nX_eW-G8> zS_Nm8;=iCSX}m_ECWh-L0(~+VU88c@+QJ}{J3}r#e6xNSR?rRxB~^o&2Lo>ls}vU} zH;woy3^}5!J2XKXu7`OGA&Hsm3KgY<*OKvUI0IK1@duTk;$+wiB^Yb-f+BO7KZjT> z2^mk|CmK(^mWG}jwlr@r#S^GAIxqXW%rV4oc2<1tTrOO8dD~|gH0*ZgNv+Rt`mx{kV{4WuZ9(9vsO++WiTb!32 zFLNM*y9-E^Icz>dnWKl_Kn)&Y`x3RbyouW5)W32vr;zsMm6B_%3KR1vXZT33hlGiU@PPCoo(? zXcKQb$#28lq7+UH$1D=t%z2w#%lT7Si^u5SV6V8@EAGTJE77B`SV?N6bttjMa{{JV zLutfQ^O>&D{91!2d$Y&UxOo4RP6mXZv2$f1IOsG^NDCUAc~|>&f_Mz;OM(!5*y#-wI$3O-luhtqfx59>Dgxhn#fP0d z$S#O81&_ExI?fiFn8TkTJ%E`SdMG`Zm)jVA9%xMs>08h^gDY;2f|U#al8yAgy2>$CxJl?bFpgLFAM3_;;%CB5O!T}NS;py6^H5Y7Gr zL@D*?cR2DkbGQwl__R@duT1}(+~Y{K5P2yvw!z6VyXp!*VSm z@CSv^WbJxD)kpUW!Ufp*Qc)eSs0yKs$?LrxZf_Mz)bqvmI znkE23VGb7X2;c*uMAg~?8U=hlnuT_xA}}r4jU+)G@qq$FP4~gqjlhO#kV*(<=uwzA zkYt$p)by=NI|}g#2HCG-52Q7IhDZ#;s4rtSg0y6r#_s)t-xFKi3z>e28xl=oD6*f^ zc>|q`ynHr4FGo2+40~}MKEUO9EEeH~d272NE*^(fmXn3Z0qZG!2~D)p1N=n`EvEMn z0$b#;lg-I7Z(pa?ARysF&`7|tS?*P|vIO0X_ycUjPleo@jKXg4I#P^;&?I!JeGSrjl#^{+PQX+0ggiOfI6?ShIg5U#W z9-Z)!Evpq$5(I znn?y>YVT#TC_Ipj#XEK=W(4p=vvdIAa*B-1MjjJ5ZYf5{85dadiXVG|Q(&zg&hvyO z8a=^@QekLHCi7kjLlY%W=sFu3DDs4+Sa6&rWs@l5iD=+fIC$VrzaEw$+Q9lvz7|O% zqSb&du~?sy5Q6S_b2lR?w-6x${IIaiav0{_z-IryAaho0$w^|o7%~+g)+0SfeF>SS z)A>rAt3hU}N%f>T;4!68(KDh|oE~jCcfS&8+#=*6k!OoEx(}Bw{VwK59TXsy@418@ z??nDlG?EOPwlN(10#=C%+w?pb06lFs*Jzv#C&xg@vs5 zlmTSOv>5JFcwQEnh(wPYAm1PZ;@1$RyCDh`8o^*2!=JmFo~wyIcN)(n&{2AT36NQt z6aj`!2P1J}33zsQM8lGXRw^{15OE{43E5dlX7*oD)nEDzi2OEFx0%wta6(l@?G+ml zfSI^lZ*)~@J#q~UlvDv((~wx0^ZW4RTzYZ{7&o#p&K9k6A!`m+DB3U}>K4fm4F_Nr zqP5;;i(%RIS`9*6E@Nbxw2`K1Fii;E0AW}~u9y()iL)wpHqAoPas?Y|GwN8RH~6_& zPK19Y#cx7VLXch5P0ECft><<(^Fc`tC*+4`??i`vKRr@=Q1=oH*t|e$+&d`L(@lc^yn7nB99LR%y*Bh7L5*7U?%I zz|g`#%#7zT!@XiHQ_r$Bd@t|S&WK4Wv>=^ULyihWc7naf{S->j18X$;G0vN%mr*Y= zi`Xemx|z-)#!nqwlFy9Jn#cvx6>;qkP}=v3Ti91GP5psI?k?GSe_Z?9FgVfnnHQ#T z1NHYx7SM(WB-79I(d}5EvW~^WAYni07kCmbL7 zV*!qniqq+5;7rhF7}2Q&wiM1`+L@N13DAj<+z6;N^zVa6S@B4!GJ@6sxXOiSuzBDY zF;%I#4Zc*VFXZk@v6u7=o{OIjOs^+_Kaj(p z1n8J=Fi`ry>X05mFpQvF+X@QgeLHx*58En=XF1{7ENcM4(h5R*&p*wdH`CDckj}uC zp!Rp6G`<&D$5C>2i-cg|UYOueqXiOda2vDzyrBYVEn3tB3v9sxB(t&m%{U%Jy_U5A zhg(g-g7-nRi^%>7790#tM@7?q=0{L{tY?_UO~E~}U~h0G7xGljgA0+e{KLTYP33L;CN_W&A9t;+I!6eiM2zxN|8H6$5YDiezUnCug zUCffch+WK;_QWn0NSk99g7j|eqDWdDyI3l{7`+IVQI~%ayRHTeqyVmId=wIZ)F44` z^bdsxQP={ye8CD2@lHEAU5L*VnSqce#72-Q2r&Oh>F;p%1@TE%;4s|?Ie=Jp$j|^u zO0%F>-~o%qZ;)1y*${l5KewMJ5FBPsPBg5ct}mLL9==L`v9y`-9JxWhL82)OJ-NPKiEz(~pX|t_-ldbN%AU#a<%{Fl_EtQ$12N^u_Mf|Sy4Il~6Ex7L#4GAlz zq~F;97#S;?*5XM@GI)+XwF5|eAsIm!RLQ3{;q;$R>ivraL;@COswYI|)KckoluAEG zvIw82?A;_rMC60vmT0;W;B$|ws2u<{3J&q8y-(RDG1O{+X=J!)8l<46jYEy%V?gcq z)R{^dXz%e@tTe4lMV|Dvc#u5+ozq zkUEKk6@!Q73~VRS^fRi@@*1k~e8BWDu2t(&UGIgx6S5wfl_am>C3GFcMP9?^n|NM> ziRCp=dv>(PvM7+CAQU4Aon8j+`VGKPDg)N0@4J&ZdR!-ngQ@_588&FR+ z-G$qTHXdLdU^x#_nAgN$4&^YJd`zClhr^4{>6Vp5;SKxCZ#On-4LJ z#1l+1$oUPlu>5yo$@^xDJ>M=Injh2WGH1}hnfgc2lGS; z5!htwEL>3{gqqoa=<6SN1)kY3?&X;@h|$aj)`ptdpfspvHq536Q8kv?a0fU5i3oQW z0EfiPhCEi6XEu0od%Y9gNS@iih{G})hN2?NY#4x(@Vo z6s_k28AmRp0)2#wQ0Pr4gsf(2pPBY!So>`F5#mID-(Y=P zVP6I8+!WWVu$SQ!Z>P{IrIP|wE9}ppgf0;tSYc;si(&>iufh$SB8-5Tgd6F-yCawJ z7Y5z9BQ^jc08%XgM1?GZ$6Mg_t+SPm&LzfPK#_$-6#Av`LJ?j@ZLKfFqv+o(W)kf~ z$EM3t0s{D7n4K2miC>D_JoJrKO*#$UdWbno+$Lgb0FH$#r@1}v-u zEuxVZU|CsUI-)rQg=DLBF0sg)M$!g&u?``Hu_xJZ0EqA)1>kqhA*3sfgnO`(L*`d_F9e+g9+j`qfU0#0%D@9Y*?I&I<~E8g zvh{fa0qBBkU4c`meG80<^uTE>^njHbwi2`PmsfJPN*No-czn)I)It(CCPiruC4k>L z2bQA{H2n#qg5Vat?~5p3+!_?k-yA-F1x#S^i1gucKt{J+g80l@9gslyWDGH}RgYoB ztfKiTen8WX$K;$eeT0OSlN{Hrf_zXA2i05+UPkC@P!%xQqV-)riRYHC~f>h)*KHThs0Ph7SrD%SALD9wIomCHCD?QGH8zw$DmHZeU|6hscBkAyI zzzt2(Q?N?iw8{hWP?B7}Bl3nVZ>=oYY0N4+;;OVnH=hi)z>pZaOPfGVG7Qi1^B+}!TCZqG)!Srp_o=E z{@WvOnwU2>3o9(yO*j{HGm8qvZQw8I^4Qt-tnJz2de)5ibEjIW|ZS*qL}M^k#ntUm_c&;DAE0UYg5qOs1~Fo=3tu<_&^m zTcinJ!~NMQY)$QIxEHewW({b<%i4A zOK6VaE$*NP=$0d;Y@PTGFRB)W8dsLzbtE96k1uB|Qc6KdSLgS#61ha2*In zpj2WsBn&W#5FOa=MPr?1Z5NZ!2%$A3s+H%N>ura{Mlemd6*o%cE z**`hHNiEIl7J;+~&z_!(nrH|16m?R7Dye&$#_2hG16`MIBxckA%ijBmy>GEVQS=u8`*fj z>k(5u;`K(%BcbLLlD57wR}|C8Wq$xRAZzw=433MvqAy)E7{UGmx=XS)&KHC%vXI=+y<@A4X=|AiJx2&4(if<< z;b@6e3)z=OSNb0nYR&+$<|VKkA-UXqBr-bi7rzQTT4yV9fSQ9^-tb88J&Nc1!1>GZgmQkAgTYq0m9ikEXyDt*3$x zkCDkM7U_f5cPIi%H)5s6p!LtKOR>6O!|Z~U@FKefWn>gY7OwNU*Nzp90h)x8I>z`z(<@`wr$?;p{;3RGwM zt`+wHFwz#y7Qtf9@F20#X+u6J5+a2hTq8@;>BKcsCWRtg7vXv?uICE6?I>C#=;~04 z>`kn{tXZz9(nbd5?t*v+!%EuCh@rd>EEI(PgjF%xdMVa3>=!_Y82Y2S&)YqSd;>%{ z5*k8cStF2`7DK|$kT4C(gDDhSfkSlE)DuOp7xs_A0l_+hbeq%~-=N{2SK@Ab9}rFE z91(L3dF;+9?&FrcOI^j_?m;&cW_YXk#r$=jh;EiLhx~7MDttK^N;<7-dDaH9nLU1Sm3Bai^PdW^8|J|w!335mX}c&4RA$((uY+S@ ziwvRUb**_#L&W6RQrcUrsdJ|&(PTC@9q8!*lTgWqI zdQ}KjE<*1~Ou-1t#=~?a4a+l{oRrN(sd5JCDXdq+yoCMC7H8rl4VEdR#gI1lTng@I(&pIb0Iox8 zcn}>ekf1$-e90LX$IEDvr}%@%4M!lSwEi-%9&}s*UdbuU3r#f8GDfff3^@~PEC=BT z=Sag?xZLn(h%8_wmcXf^)x{-&jOmSkx(ER;Hf z4TXGr3?%okIn3gK(jTym3rthdv;de?RuN)&l{v7M0z(=yX`Z1$ij?vlHLe2>K#4w2 zWdtNga146>GOUbv$gCd1Nuxu+#D6~MaZ3&`gj7Q<62YH-Mok&+LwzCm1Op)&Zev%l zwp7{68@ig94SsE^ly!*AOs@6e#L^-J!#|U378`TDqHo|EUPKljlRqr`lQCNGKE#bYBRD_LTmgJFF5Nd!ra6Hh3?+v{Ph_URVsg}* zA2;Ea`7Oi`pDE%Z?0X^sgcX=ew*FQr+|LT9WJcBIW`q%f59x*A-$~B6^I=h%AOAh8 z<+TrY=K1WyeL2p&`?bD{&1+l`b{USQCFf^v2tBBEh5DwIc?W0eT{_v5y~lry7TleA zm-?H8(8K}j&HzZ6(dg0Dd$M=z-l2+L?Mf6VrY*a@NX zb+8o1I{aPh?(WBqc;co)2v~TmV?vR{wLG;zSMM^q2V@rL_9%50A0$!e%)88A?LkIFA^f21 zZ~U)iccYRENPSEu+C3J$WkGTye-fYZH zHb6pXO8WX#U_2!>cBuI+x4C705W9$YQfL6aArATh)(12fxH^w)`>$RjA<8!jaAKnX zfnr4ThT`nDdz(4Mj}R9UKmd3?AdyWP`3cPkFu!@tZfC`^l>Yt!NGb(>P(ZM(%x~$Z z53R#8M>X6u!&=Zqlf+gaiB&|wqFI<7e6K4s!Q%QX*b~N^pAZft8)WOLLYlaS>;K82L@=7Fxg2Vpmtap`WfJ8hf+2P_%iN^c7V9I~$ff6w^FA5X;$Kb~qN z(c4S5zBYx85Ey$K!sa{2^YEp(NvLT_6>1Kp3c7UU4C$b+vzDh;x$=;3E67O3L{uvP zKj04(jU~ikt5`78V6T+IUU>+SSwv;IPQX~fe`CfeLf&v>X>+&ZLNO?7nu`XZMgpIY z=M8?21_#y%;>0Y7dze?q3hz-iC9fqMz^UB2?v z!#ad?5eR)B)T0F;ghr9Eqg{;P4OU_5P^wH?WPml`rJ$_9$rOJopgSX@0w;C;5jZtQ zhEjo0KQRl^loaFnkgde(y*#2mwceRY#mKM6n*i8>(Ofx()nW{xzVkuqkowNoh}Xf8 z(@3kKFLU?9S-$%MqPIU?Iu0{H`UKGauH{t@p-Ob;FUI4{7NB+Parua_3Sv6m#v)1vStC_*^pp%x9Tsj*khz&=Qi-RmJconAJB07p_PUM%+S zxvV-Kprq! z!L?!gS17Sgs8tO77=RMijeFxjU$Lb)7AVio*$ezFuzpXc%2gXCW?R{1-W0lFItf4T%&bX zyRC5I{Hv0MoPWJMd11HVC`$Mh>&Az)LZs{+Oie3m<@U4*y zj3F?ZSct)T+YFr5e5Mz4J0m^vAJF3kMCDz&qq&VBa%CeDT=7^RX*4{2B}k!%aT|F{ z2;GPmeU7V0MaBohDZX5?lFkc+d-!aDaH_8lrY~Mo*bhr7G-xJ71uUh|AUBB%0h&@`P?06-jM+7_6e?^t?(jB>9fPM7(`?@O=phy@UG z70MzmEC)|uo)Hy{{_CZW_QUvcT5y-dB*xSx)uX81X<315s&g5njO{ui=SR??*Ue`bZ?84iH$ofE90g~iVYWS`IrA@4ex?Ib;{4T9A zlV0)!3m^!M{#T_VAEBds?HWnrk>7%21sGklFO#zGrf7Y3D2;)TYkdYwIc%M5GZZ#$ z;>Gm3sT{=#^LfyncmiAue=T=VvHB2OT%*@l5F5vW-F3i_&G5KMP4JTHS*+tj`!IU} zp%j*@d>*9-_jbd89ZmvPkN4RxFTcjo(UH zTB+tWsq=$rY~#o9OCXYYO>c5a@}xKWBiuq3BO08}%vHDOF}fXF9vSU&gqK|`deRZf zrL~Sq%(yxbhK)Xjyk+aciPTM)xR_98p&0M2I;4`T+ z#Bk8<t{s%jQ$9S821bbM2v&qDxD&S zorhX?z)gkhiReUErYZ~D8DE=dxDgoU?thP@Dtem6;zJPwJVtN5P~5AGDoLO3 zf?`H2$}ozqcG7s}4;q4V|7c!qoCz0Xw60TY>Z#_-yk-l6t9U^Qi23Q|mC%^_pP+W= zl2_QFFbAuHd^4TV%(65zP%svGLI|~ib!i5`#_|M5rjlkMlS|aY-0~V>{!kwG$&@9j z^{Jpeta#Xvn`V*S0b3nT1&puXt7EDU!nYb;zjh@4R?S*sPWt)6Zbu2L7hWhYf*!eAV z&h+aOhHyUSv6JiM(70?!Uc7YnDhhqsd>4~ddzq@Fw{(ArV(D896$T-Qb6#OLDo|S# zR{%dqzxWW>d~HQ}U4SAOSXP@4JBoR0f=I|gNs5MhsrjwVGG1~K%MWS*8uLxZVj1Pl ziI-C1rG~nwRt~xHT(k*0jo1#>hoWYB#h%`LB5)X>r4ow~7a^HbEvmM8DEA%#rl1Yb z!Vln2QlAC5wGePxl&ZKY6DTm#mIZ$t7f%4ZejgncL;Z)Rw4#1-W(IUmU zDc)sa42rjc%4Y*7xw>{O=GLR&G1SZ9x!57Y6sn9-LH&Lrs|X=tlD=nD-XguagRoQf zy1{b;06$ZK-y5PJ3cW#v&V56)VXpWUDB{AKw9Rg;yY07+XXu86oRHY|pQ5e>oMU^szM;jF$m6#VplP6|NOBXTSh8W}*0Ib9y0s0v- zV<-rC1)r!NA_-}w5aJoxqO~4tJJN8fBJSlCdVBzKv7q5GB=bNkBfd}m5}Vwy_GpI- z%prs<8+~p;>@PSz!W-1$hDbhM*P}N^E}_Ua#WN}3^D1Ow;31@X(>8Hiz-vgf;#uBL zu>g2|D;qzlEs*;)!eLh%Gta(_5!GaG*xBMOuJ+(P#+pO= zsbc!2p6rto%y0EIhbF%_KX9`D68-$Z1{=Ph(IezS0Yd#KsDT6^=^cTSIv;&9%*P^n zqxr2G^IMy<8+@6SjSr+2gl5SRJq6ba9J?P`P8tLrCQ=Tnk#7V328qBP3+-4@LKKGb z^|F{h&2^)1h;%U+7dwmg7oHKueF0QUv4vkXWJvEhh^FgnSpS(g+=?Z9^Wz(6NGLYT zU%jT~WVlVvLPSj9og+Xdd4qRQ#Ol=4kX?&xh}ixo9`S%j{MPIEa>+2Z9}Kb_Wa|M3 z4KcP2*zS@)M7YB|?NdSbo!~gJ7>O;L=!Gn}jm*0oju;AUdlTIs$h^jAUei}sm9DFT z74OtCaru>y{e#CLFL}x;~=-i^WuWOgh<(BX`6$;HSI z03kf|Nr?wm6TZQC;}wsuZ2$R>J)(^LH66zm4;6HuAbL=G0mJEU z`K(KrxE!a?P-V%5sN!)PSaLqA@?@JT**^%5GmH7%`_;Q}Ou%iA0>J4KBq)N>_7J1l z>CLe09m;-1?T`n|X|9|@wv>1*d;=YIXyQcaP_P~~#c@qdY|4kGPLy28xbu4jo6qx< z?r>~;pD{-XSu9(K2^=-chGVjnTBZgu%#(wBn2|$;&YA-h_VJ3JhZ}H2L8)bOa5k7B zRtt}s15K=!9DacvIqwM~=S4wOcoWGh#H(JE6Hf|ozKH)R03Ln@y(`~H6NIAP_>Mp{ zMuL5Oz2ZmUd;dt9Ao#P(*H>Bzb4z^_^o~6;c4XL%MEQ6@jfq0ZbH4ZKQG>fGBl0P| zfXL3O@wO-;=pJ!D?ZuCDRln7>TyLpLK|&7#N+Z}Z>DQ5q;tSK6e8g*|Fl4`kyW`in ztNM_hc!B}weNEMj{<1rCT~W9cLxuLF!@!HZbIJyf>C{=6{smTL`XgL|R7bd%*fS1q z`jsxJbL(wbsja4hWzEY|B7@Cqkc9J<4j=dl985E>@%FWu|ALo5YpQVOVw(?q5*duS zRkI$}0rs?B(-=5}G&M=L`?HD}dYgYRQtS$r8w-#GypN1;q;C_sAN)1Q9oRUl77{!X zmeQUh(}VU$2?Gj*i4vc3vJf>~&PIP<=|c2I5lP3OA>qv4PUQU(F|pF4^yMM87O`q0 zu`5j7zyn6uKiID%GE4|v2X_E_U7lLf6Layn+t^?4|2Nq|*$8iFh3tK(mUKyiY2G4W z$`&M;994J9o-2eFLMaDtnJWbS3y_Yu2&Db$JR zW-ti;nT5c?X6g4MLGf(hNHzw{g$L?&Tem{Y4vao2W!Di=S%!Y^dd(-F-~mKDp)uLJ zCIXT$v48+0+i;)H~2cWn}^F zV@KR6&E@&j3hdWKn-GV2I8#GzM1dx-iszNo3nD%ulDkd1^p}Jg#z4dvh!}&=Jf32R zC<=QwuI-o=Va%KuGl8X$iiRutsAFanif@^V-OrKZi6M~??5N!TNMB&-5gVl|O;{?Z z#m9k`rHFgoqJL=tA4cp9Ps7N&v<1m+*x4xAI3Bo+#_=F6NIV2B<`Lib#Ku8~^_R&Q z&Yj9|mc(7ghI4{t$(2YJOdL)u5n;Y!96v-*f{i2XR8x7}TyY9hvOZNEOXV?X4x1os z#U?tIbu^a8*+ZM~kQ;_g7NR1QsYgp%d~VYi4nQZU2hXDxaj6q@g1dPKGJh!h8z(u) z!T$i8#8ARX7J9jZGqbc8S&2e1RSV0aBHscnz zLk!GESr*+ugzKpsnmH(hG>V%v4lLJWnGTDvm`qb+lW8c*DL14Ldv9!$zWX_wI}oz8 zcNo&CL-QxMlVoO%!-td z8?9O|;%jN8SWEkyEM6A>cF8I2NE_sIJW(zZ8GEc6yBr%S7K@0;~e{PMB^?`$>IcpreaKF;IN{ zkpSl48-4r5+VYbc8$z>BRfFHG(vzUu+bm$3DHU(WIM+t*SjU#`zJthKDTt?;_!kZT zix>^QnBlD>DU2e@mhCSZD4r9jb_NX(P+$ic{S%53FDSyX7Zx zdi_->-dEYUw8Sy!GX%9te~P}r5B~5X;QHlwj1sbevGn^TvX=G7kGu2ow7y9~U|C+4 z>>Dp-f+Unk^b=^d^RxH*dST<=3zDqD(!K`^F+c=E2zc=@44m_&5uj|nhR7_PfuIY( zEQsz?*n0Vt@ps_l84S)YURU}GNB($ZDtd64!(^i#Tr3nL9&hT49w1OJD@7)ty-^O+YDBI|hx5^S ziNX$vql4(Jd5znc7dYs|r>z{($0ZBefWgS;ZFEdHdyD%-S6{mh?{ZAW$t%^qiDG{C z1IEB@7J$DWqjzbg{K#nOpIAYo*ZnY&K9pvqlX~&>Yz|E6YoXvlhB&crjg<0=)@NuA z6!-mstkdYKG@o5+{2pdJZNh=Vo5M8arMqD~K}@qS_Fx957vLZYvPD|N8kOEOus}L( z_(_k|Ze0hxqzOau(|b&69DY%z8eDK@-Oo(AT{DfmhTy@*$qfU zxVe1I2bMB>DS+>vf_!6cmG@jnLd=a1WvxL3gk=N`)0AnF<^cf&eFKWdoCzNo5;lb> zzlGje`8Fcol&5NU3?g~ryH_Ya4b%I1Hm&uDeO7}EGex0qP1tn2M$0xAd5qmmKPi3J zm!_la(}MywJarep(ZZwoyR#r6Mbiwm_ObPZw!ux;0ecI!^p8BwNiYwX5DB<6f(#

;FMraH54X3E0eBLGel+S0(Z7 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 literal 128000 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 diff --git a/UnsafeMemcpy.jar b/UnsafeMemcpy.jar index 727cfc23de38be8fe769e139876bc82c89003aa9..adc4f11310e4b2e8704b9dfa79a23f13e8a0235a 100644 GIT binary patch literal 4874 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 gr0*Epa9Cd9=R0DuVhA;uYUh3e$)UybW@d;kCd literal 3504 zcmbW32{hDeAIHZsV;gIT2B8esHn!4DwvgRSjY8JJWNnPbR;FQWp-{3Um8Cb5M9Pax zlVP$HCMH{vu}sPs4YJ%YUEceid-a~vx%a)l=lsw4{?GsXzt1_(_dMV8LD=)~N&@)# z`2oL_q`Lxkj3j^;;ArJ+u4U_V4CZL=WP8jC>8$N|jPnuzSaR%s0Vc?D_a>Kp0PmLYXsvvt8IXOH?$_O>TO zp%O45Sgc(+$byW}S$XUcvzCF@h^G+cEar&Hw zu!RgwSN&Mdou}68d#oMpTO<&-3_Nu*{YgHqwZ$nLPkdE&ja^;xzdFZEdruf;EnY>X zIA<{`E*k2r@`=OMn@auBxe+s$Y#d`c1FHnQW$UiJVdiJ%R?rMcQrXjS7xaw-C!A0`QQS)4mso8Fa!%%mMYJK8r&~{GNF7HAi@>nOMrW zRbYrY@cDBwsRJL$?UcfH9+~WeseErPmml4Y?3d=L>MLT{PLcQ0v-IW%)0kw6aku_@ z#2F(N0Z)3ybEy4JCb-Ru;-`V#o7GI2Iwg@YW+HlixGApo5v>O(+Hqv?8d^IT ztOtuQ>V1SJL5f31z|+NP&$Oco*StntWT**Xr1H(q)CR4?4_Y0*Ip+fleCFvu{RbZQ z=w!#zBsV3Mnbai;a8fxut---V>5;@xDwCoYp6IHCk*H67M+rVWmYFI$N8s9y@|?HM zi}0-|2e@}ex%|(f+`7sCjdCz38fhihvCw$$UrNr>hL%T?*=YvVN<*_bDc=6HQY&cJV*=5n0BBB$UPrgfY* zUy%%WuIT{Bx!yFxcxmc})Afqm8(`q!BmODwM#hohZ|}GH^}G2{fh!(9aL|gs50!Vt z!G{W33H5;kSDby|d@B*<&qCirrYwoCak>Y%o6% z{f0UuqJV)85tIUv!T2-~Cw?UGJWR;284o1Tr;*42g29RY zz)V-QUMCSGl{nM7ME?~l-VD%A+1+}X{sJq|%&VRJihizv`%zMU>q+c^X7GoJJq^-c zBGvIOt&uf=>ICM*0DDgZmzPj=;!qoep23DTh_8?fC!jGxqu{XQO~g@Py_s-*>)F?4 zLSczKSR=V4BRY#M5~CV{Rh3Ik~X|^EENeR+MW3TBc3BfzJf2 zft57juEc@|edOnpvs%LsaY1SXR44qfdq+k0UV^u%P9WJqYhb*z37=?7B3lfvKmvFt z!N~a&s2E;_Ip-(`-BaUI^*hqM>o#clVEKxwh5G%o;OIe(9nTw4Vk+d04|I& z85kX7SPCv^mT{uNr1w55ip2{j#z?mW$*JSj~ab?Sb~hj7`-p8}MI9h&U&preA+6Ad(! z>irqyq{r&v+k{jtfq$zkgT)J^{f8T|l9GN+Vi)ofe7!7#o$^&n_2uuKE=%os30A2L zaydUJ)*slB;VHfE#ePo%)3GRt^jK@S1wyqkK}ddrTJR z{Smz4f|7zQ{)(zZk@8RBQq=t>9YSfa$57qmrxdW4ZTDmy#jw-1d#Z}Uoh~u-SSfth z=lvvWTPL)A)RWEK+t(}p6*>j9MP)eP_Vwc8mIVBX`#U*(8~4ATAHn}lmu;rs$$r~R z|L35#3r|3uyqW7!}$-e+3CDpT075s fyR`nCO#Z)i-cex)dmw20XW-VV+Tt;m(DvJJ^G*2k diff --git a/java/net/lax1dude/unsafememcpy/UnsafeArrays.java b/java/net/lax1dude/unsafememcpy/UnsafeArrays.java new file mode 100644 index 0000000..2c77d88 --- /dev/null +++ b/java/net/lax1dude/unsafememcpy/UnsafeArrays.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2024 lax1dude + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS†+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +package net.lax1dude.unsafememcpy; + +public class UnsafeArrays { + + static { + UnsafeUtils.loadNatives(); + } + + public static final int JNI_COMMIT = 1; + public static final int JNI_ABORT = 2; + + public static native long getBooleanArrayElements(boolean[] array); + + public static native long getByteArrayElements(byte[] array); + + public static native long getCharArrayElements(char[] array); + + public static native long getShortArrayElements(short[] array); + + public static native long getIntArrayElements(int[] array); + + public static native long getLongArrayElements(long[] array); + + public static native long getFloatArrayElements(float[] array); + + public static native long getDoubleArrayElements(double[] array); + + public static native long getBooleanArrayElements(boolean[] array, boolean[] isCopy); + + public static native long getByteArrayElements(byte[] array, boolean[] isCopy); + + public static native long getCharArrayElements(char[] array, boolean[] isCopy); + + public static native long getShortArrayElements(short[] array, boolean[] isCopy); + + public static native long getIntArrayElements(int[] array, boolean[] isCopy); + + public static native long getLongArrayElements(long[] array, boolean[] isCopy); + + public static native long getFloatArrayElements(float[] array, boolean[] isCopy); + + public static native long getDoubleArrayElements(double[] array, boolean[] isCopy); + + public static native void releaseBooleanArrayElements(boolean[] array, long ptr, int mode); + + public static native void releaseByteArrayElements(byte[] array, long ptr, int mode); + + public static native void releaseCharArrayElements(char[] array, long ptr, int mode); + + public static native void releaseShortArrayElements(short[] array, long ptr, int mode); + + public static native void releaseIntArrayElements(int[] array, long ptr, int mode); + + public static native void releaseLongArrayElements(long[] array, long ptr, int mode); + + public static native void releaseFloatArrayElements(float[] array, long ptr, int mode); + + public static native void releaseDoubleArrayElements(double[] array, long ptr, int mode); + +} \ No newline at end of file diff --git a/java/net/lax1dude/unsafememcpy/UnsafeMemcpy.java b/java/net/lax1dude/unsafememcpy/UnsafeMemcpy.java index a3bed39..27ea841 100644 --- a/java/net/lax1dude/unsafememcpy/UnsafeMemcpy.java +++ b/java/net/lax1dude/unsafememcpy/UnsafeMemcpy.java @@ -36,326 +36,392 @@ public class UnsafeMemcpy { public static native void memcpy(long dstAddress, long srcAddress, int byteLength); - public static native void memcpy(long dstAddress, long srcAddress, long byteLength); - public static native void memcpy(Buffer dstAddress, int dstOffset, long srcAddress, int byteLength); - public static native void memcpy(Buffer dstAddress, long dstOffset, long srcAddress, long byteLength); - public static native void memcpy(byte[] dstAddress, int dstOffset, long srcAddress, int byteLength); - public static native void memcpy(byte[] dstAddress, long dstOffset, long srcAddress, long byteLength); + public static native void memcpyUnaligned(short[] dstAddress, int dstOffset, long srcAddress, int byteLength); - public static native void memcpy(short[] dstAddress, int dstOffset, long srcAddress, int byteLength); + public static native void memcpyAlignDst(short[] dstAddress, int dstOffset, long srcAddress, int length); - public static native void memcpy(short[] dstAddress, long dstOffset, long srcAddress, long byteLength); + public static native void memcpyUnaligned(char[] dstAddress, int dstOffset, long srcAddress, int byteLength); - public static native void memcpy(char[] dstAddress, int dstOffset, long srcAddress, int byteLength); + public static native void memcpyAlignDst(char[] dstAddress, int dstOffset, long srcAddress, int length); - public static native void memcpy(char[] dstAddress, long dstOffset, long srcAddress, long byteLength); + public static native void memcpyUnaligned(int[] dstAddress, int dstOffset, long srcAddress, int byteLength); - public static native void memcpy(int[] dstAddress, int dstOffset, long srcAddress, int byteLength); + public static native void memcpyAlignDst(int[] dstAddress, int dstOffset, long srcAddress, int length); - public static native void memcpy(int[] dstAddress, long dstOffset, long srcAddress, long byteLength); + public static native void memcpyUnaligned(long[] dstAddress, int dstOffset, long srcAddress, int byteLength); - public static native void memcpy(long[] dstAddress, int dstOffset, long srcAddress, int byteLength); + public static native void memcpyAlignDst(long[] dstAddress, int dstOffset, long srcAddress, int length); - public static native void memcpy(long[] dstAddress, long dstOffset, long srcAddress, long byteLength); + public static native void memcpyUnaligned(double[] dstAddress, int dstOffset, long srcAddress, int byteLength); - public static native void memcpy(double[] dstAddress, int dstOffset, long srcAddress, int byteLength); + public static native void memcpyAlignDst(double[] dstAddress, int dstOffset, long srcAddress, int length); - public static native void memcpy(double[] dstAddress, long dstOffset, long srcAddress, long byteLength); + public static native void memcpyUnaligned(float[] dstAddress, int dstOffset, long srcAddress, int byteLength); - public static native void memcpy(float[] dstAddress, int dstOffset, long srcAddress, int byteLength); - - public static native void memcpy(float[] dstAddress, long dstOffset, long srcAddress, long byteLength); + public static native void memcpyAlignDst(float[] dstAddress, int dstOffset, long srcAddress, int length); public static native void memcpy(long dstAddress, Buffer srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long dstAddress, Buffer srcAddress, long srcOffset, long byteLength); - public static native void memcpy(Buffer dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); - public static native void memcpy(Buffer dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); - public static native void memcpy(byte[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); - public static native void memcpy(byte[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(short[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); - public static native void memcpy(short[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(short[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int length); - public static native void memcpy(short[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(char[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); - public static native void memcpy(char[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(char[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int length); - public static native void memcpy(char[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(int[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); - public static native void memcpy(int[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(int[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int length); - public static native void memcpy(int[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(long[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(long[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int length); - public static native void memcpy(long[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(double[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); - public static native void memcpy(double[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(double[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int length); - public static native void memcpy(double[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(float[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); - public static native void memcpy(float[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); - - public static native void memcpy(float[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(float[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int length); public static native void memcpy(long dstAddress, byte[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long dstAddress, byte[] srcAddress, long srcOffset, long byteLength); - public static native void memcpy(Buffer dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(Buffer dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); - public static native void memcpy(byte[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(byte[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(short[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(short[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(short[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int length); - public static native void memcpy(short[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(char[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(char[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(char[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int length); - public static native void memcpy(char[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(int[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(int[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(int[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int length); - public static native void memcpy(int[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(long[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(long[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int length); - public static native void memcpy(long[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(double[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(double[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(double[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int length); - public static native void memcpy(double[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(float[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(float[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(float[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int length); - public static native void memcpy(float[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(long dstAddress, short[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long dstAddress, short[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(long dstAddress, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(long dstAddress, short[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(Buffer dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(Buffer dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(Buffer dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(Buffer dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(byte[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(byte[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(byte[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(byte[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(short[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(short[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAligned(short[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(short[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(short[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(char[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(short[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(char[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(char[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(int[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(char[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(int[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(char[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(long[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(int[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(int[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(double[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(int[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(double[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(long[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(float[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(long[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(float[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(long[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(long dstAddress, char[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(double[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long dstAddress, char[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(double[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(Buffer dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(double[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(Buffer dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(float[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(byte[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(float[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(byte[] dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(float[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int length); - public static native void memcpy(short[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(long dstAddress, char[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(short[] dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(long dstAddress, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(char[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(Buffer dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(char[] dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(Buffer dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(int[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(byte[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(int[] dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(byte[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(long[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(short[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long[] dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(short[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(double[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(short[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(double[] dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(char[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(float[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAligned(char[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(float[] dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(char[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(long dstAddress, int[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(char[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(long dstAddress, int[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(int[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(Buffer dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(int[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(Buffer dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(int[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(byte[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(long[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(byte[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(long[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(short[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(long[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(short[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(double[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(char[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(double[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(char[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(double[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(int[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(float[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(int[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(float[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(long[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(float[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int length); - public static native void memcpy(long[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(long dstAddress, int[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(double[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(long dstAddress, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(double[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(Buffer dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(float[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(Buffer dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(float[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(byte[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long dstAddress, long[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(byte[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(long dstAddress, long[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(short[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(Buffer dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(short[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(Buffer dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(short[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(byte[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(char[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(byte[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(char[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(short[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(char[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(short[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(int[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(char[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAligned(int[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(char[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(int[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(int[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(int[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(int[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(long[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(long[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(long[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(long[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(double[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(double[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(double[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(double[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(float[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(double[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(float[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(float[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long dstAddress, double[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(float[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(long dstAddress, double[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(float[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int length); - public static native void memcpy(Buffer dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(long dstAddress, long[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(Buffer dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(long dstAddress, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(byte[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(Buffer dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(byte[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(Buffer dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(short[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(byte[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(short[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(byte[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(char[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(short[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(char[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(short[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(int[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(short[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(int[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(char[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(char[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(long[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(char[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(double[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(int[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(double[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(int[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(float[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(int[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(float[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(long[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long dstAddress, float[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAligned(long[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(long dstAddress, float[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(long[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(Buffer dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(long[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(Buffer dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(double[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(byte[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(double[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(byte[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(double[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(short[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyUnaligned(float[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(short[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignSrc(float[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(char[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignDst(float[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int length); - public static native void memcpy(char[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(long dstAddress, double[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(int[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(long dstAddress, double[] srcAddress, int srcOffset, int length); - public static native void memcpy(int[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(Buffer dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(long[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(Buffer dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); - public static native void memcpy(long[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(byte[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(double[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(byte[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); - public static native void memcpy(double[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyUnaligned(short[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); - public static native void memcpy(float[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + public static native void memcpyAlignSrc(short[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); - public static native void memcpy(float[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + public static native void memcpyAlignDst(short[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(char[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(char[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(char[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(int[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(int[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(int[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(long[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(long[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(long[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(double[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAligned(double[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignSrc(double[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(double[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(float[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(float[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(float[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(long dstAddress, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(long dstAddress, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(Buffer dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(Buffer dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(byte[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(byte[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(short[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(short[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(short[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(char[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(char[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(char[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(int[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(int[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(int[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(long[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(long[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(long[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(double[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAlignSrc(double[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(double[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyUnaligned(float[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpyAligned(float[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignSrc(float[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); + + public static native void memcpyAlignDst(float[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int length); } diff --git a/java/net/lax1dude/unsafememcpy/UnsafeUtils.java b/java/net/lax1dude/unsafememcpy/UnsafeUtils.java index 6aafa24..cf12275 100644 --- a/java/net/lax1dude/unsafememcpy/UnsafeUtils.java +++ b/java/net/lax1dude/unsafememcpy/UnsafeUtils.java @@ -45,6 +45,11 @@ public class UnsafeUtils { }else { System.loadLibrary("unsafememcpy"); } + int major = getVersionMajor(); + int minor = getVersionMinor(); + if(major != 1 || minor < 0) { + throw new UnsatisfiedLinkError("Invalid UnsafeMemcpy native library version: " + major + "." + minor + " (expected: 1.0)"); + } } } diff --git a/native/UnsafeArrays.c b/native/UnsafeArrays.c new file mode 100644 index 0000000..1b41889 --- /dev/null +++ b/native/UnsafeArrays.c @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2024 lax1dude + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "UnsafeArraysImpl.h" + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getBooleanArrayElements + * Signature: ([Z)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getBooleanArrayElements___3Z + (JNIEnv * jniHandle, jclass jniClass, jbooleanArray array) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL(jniHandle, array, jboolean, GetBooleanArrayElements); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getByteArrayElements + * Signature: ([B)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getByteArrayElements___3B + (JNIEnv * jniHandle, jclass jniClass, jbyteArray array) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL(jniHandle, array, jbyte, GetByteArrayElements); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getCharArrayElements + * Signature: ([C)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getCharArrayElements___3C + (JNIEnv * jniHandle, jclass jniClass, jcharArray array) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL(jniHandle, array, jchar, GetCharArrayElements); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getShortArrayElements + * Signature: ([S)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getShortArrayElements___3S + (JNIEnv * jniHandle, jclass jniClass, jshortArray array) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL(jniHandle, array, jshort, GetShortArrayElements); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getIntArrayElements + * Signature: ([I)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getIntArrayElements___3I + (JNIEnv * jniHandle, jclass jniClass, jintArray array) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL(jniHandle, array, jint, GetIntArrayElements); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getLongArrayElements + * Signature: ([J)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getLongArrayElements___3J + (JNIEnv * jniHandle, jclass jniClass, jlongArray array) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL(jniHandle, array, jlong, GetLongArrayElements); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getFloatArrayElements + * Signature: ([F)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getFloatArrayElements___3F + (JNIEnv * jniHandle, jclass jniClass, jfloatArray array) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL(jniHandle, array, jfloat, GetFloatArrayElements); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getDoubleArrayElements + * Signature: ([D)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getDoubleArrayElements___3D + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray array) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL(jniHandle, array, jdouble, GetDoubleArrayElements); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getBooleanArrayElements + * Signature: ([Z[Z)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getBooleanArrayElements___3Z_3Z + (JNIEnv * jniHandle, jclass jniClass, jbooleanArray array, jbooleanArray isCopy) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL_IS_COPY(jniHandle, array, jboolean, GetBooleanArrayElements, isCopy); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getByteArrayElements + * Signature: ([B[Z)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getByteArrayElements___3B_3Z + (JNIEnv * jniHandle, jclass jniClass, jbyteArray array, jbooleanArray isCopy) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL_IS_COPY(jniHandle, array, jbyte, GetByteArrayElements, isCopy); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getCharArrayElements + * Signature: ([C[Z)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getCharArrayElements___3C_3Z + (JNIEnv * jniHandle, jclass jniClass, jcharArray array, jbooleanArray isCopy) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL_IS_COPY(jniHandle, array, jchar, GetCharArrayElements, isCopy); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getShortArrayElements + * Signature: ([S[Z)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getShortArrayElements___3S_3Z + (JNIEnv * jniHandle, jclass jniClass, jshortArray array, jbooleanArray isCopy) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL_IS_COPY(jniHandle, array, jshort, GetShortArrayElements, isCopy); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getIntArrayElements + * Signature: ([I[Z)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getIntArrayElements___3I_3Z + (JNIEnv * jniHandle, jclass jniClass, jintArray array, jbooleanArray isCopy) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL_IS_COPY(jniHandle, array, jint, GetIntArrayElements, isCopy); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getLongArrayElements + * Signature: ([J[Z)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getLongArrayElements___3J_3Z + (JNIEnv * jniHandle, jclass jniClass, jlongArray array, jbooleanArray isCopy) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL_IS_COPY(jniHandle, array, jlong, GetLongArrayElements, isCopy); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getFloatArrayElements + * Signature: ([F[Z)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getFloatArrayElements___3F_3Z + (JNIEnv * jniHandle, jclass jniClass, jfloatArray array, jbooleanArray isCopy) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL_IS_COPY(jniHandle, array, jfloat, GetFloatArrayElements, isCopy); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: getDoubleArrayElements + * Signature: ([D[Z)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_getDoubleArrayElements___3D_3Z + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray array, jbooleanArray isCopy) { + UNSAFE_ARRAYS_GET_ELEMENTS_IMPL_IS_COPY(jniHandle, array, jdouble, GetDoubleArrayElements, isCopy); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: releaseBooleanArrayElements + * Signature: ([ZJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_releaseBooleanArrayElements + (JNIEnv * jniHandle, jclass jniClass, jbooleanArray array, jlong ptr, jint mode) { + UNSAFE_ARRAYS_RELEASE_ELEMENTS_IMPL(jniHandle, array, ptr, jboolean, ReleaseBooleanArrayElements, mode); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: releaseByteArrayElements + * Signature: ([BJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_releaseByteArrayElements + (JNIEnv * jniHandle, jclass jniClass, jbyteArray array, jlong ptr, jint mode) { + UNSAFE_ARRAYS_RELEASE_ELEMENTS_IMPL(jniHandle, array, ptr, jbyte, ReleaseByteArrayElements, mode); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: releaseCharArrayElements + * Signature: ([CJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_releaseCharArrayElements + (JNIEnv * jniHandle, jclass jniClass, jcharArray array, jlong ptr, jint mode) { + UNSAFE_ARRAYS_RELEASE_ELEMENTS_IMPL(jniHandle, array, ptr, jchar, ReleaseCharArrayElements, mode); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: releaseShortArrayElements + * Signature: ([SJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_releaseShortArrayElements + (JNIEnv * jniHandle, jclass jniClass, jshortArray array, jlong ptr, jint mode) { + UNSAFE_ARRAYS_RELEASE_ELEMENTS_IMPL(jniHandle, array, ptr, jshort, ReleaseShortArrayElements, mode); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: releaseIntArrayElements + * Signature: ([IJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_releaseIntArrayElements + (JNIEnv * jniHandle, jclass jniClass, jintArray array, jlong ptr, jint mode) { + UNSAFE_ARRAYS_RELEASE_ELEMENTS_IMPL(jniHandle, array, ptr, jint, ReleaseIntArrayElements, mode); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: releaseLongArrayElements + * Signature: ([JJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_releaseLongArrayElements + (JNIEnv * jniHandle, jclass jniClass, jlongArray array, jlong ptr, jint mode) { + UNSAFE_ARRAYS_RELEASE_ELEMENTS_IMPL(jniHandle, array, ptr, jlong, ReleaseLongArrayElements, mode); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: releaseFloatArrayElements + * Signature: ([FJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_releaseFloatArrayElements + (JNIEnv * jniHandle, jclass jniClass, jfloatArray array, jlong ptr, jint mode) { + UNSAFE_ARRAYS_RELEASE_ELEMENTS_IMPL(jniHandle, array, ptr, jfloat, ReleaseFloatArrayElements, mode); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeArrays + * Method: releaseDoubleArrayElements + * Signature: ([DJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeArrays_releaseDoubleArrayElements + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray array, jlong ptr, jint mode) { + UNSAFE_ARRAYS_RELEASE_ELEMENTS_IMPL(jniHandle, array, ptr, jdouble, ReleaseDoubleArrayElements, mode); +} diff --git a/native/UnsafeArraysImpl.h b/native/UnsafeArraysImpl.h new file mode 100644 index 0000000..f4f2355 --- /dev/null +++ b/native/UnsafeArraysImpl.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2024 lax1dude + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include + +#include "utils.h" + +#define UNSAFE_ARRAYS_GET_ELEMENTS_IMPL(jniHandle, array, elementType, getElementsFunction)\ + elementType* srcArray = (*jniHandle)->getElementsFunction(jniHandle, array, NULL);\ + if(!srcArray) {\ + unsafeThrowOutOfMemory(jniHandle);\ + return 0;\ + }\ + return (jlong)srcArray;\ + +#define UNSAFE_ARRAYS_GET_ELEMENTS_IMPL_IS_COPY(jniHandle, array, elementType, getElementsFunction, isCopy)\ + jboolean wasCopied;\ + elementType* srcArray = (*jniHandle)->getElementsFunction(jniHandle, array, NULL);\ + if(isCopy) {\ + (*jniHandle)->SetBooleanArrayRegion(jniHandle, isCopy, 0, 1, &wasCopied);\ + }\ + if(!srcArray) {\ + unsafeThrowOutOfMemory(jniHandle);\ + return 0;\ + }\ + return (jlong)srcArray;\ + +#define UNSAFE_ARRAYS_RELEASE_ELEMENTS_IMPL(jniHandle, array, ptr, elementType, releaseElementsFunction, mode)\ + (*jniHandle)->releaseElementsFunction(jniHandle, array, (elementType*)ptr, mode); diff --git a/native/UnsafeMallocImpl.h b/native/UnsafeMallocImpl.h new file mode 100644 index 0000000..bf9a7d7 --- /dev/null +++ b/native/UnsafeMallocImpl.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024 lax1dude + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include + +#include "utils.h" + +#define UNSAFE_MALLOC_IMPL(size) malloc((size_t)(size)) + +#define UNSAFE_CALLOC_IMPL(num, size) calloc((size_t)(num), (size_t)(size)) + +#define UNSAFE_REALLOC_IMPL(address, size) realloc((void*)(address), (size_t)(size)) + +#define UNSAFE_FREE_IMPL(address) free((void*)(address)) diff --git a/native/UnsafeMemcpy.c b/native/UnsafeMemcpy.c index 4cb688e..e3902f0 100644 --- a/native/UnsafeMemcpy.c +++ b/native/UnsafeMemcpy.c @@ -36,16 +36,6 @@ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__JJI UNSAFE_MEMCPY_IMPL(dstAddress, srcAddress, byteLength); } -/* - * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (JJJ)V - */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__JJJ - (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jlong srcAddress, jlong byteLength) { - UNSAFE_MEMCPY_IMPL(dstAddress, srcAddress, byteLength); -} - /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy * Method: memcpy @@ -56,16 +46,6 @@ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava UNSAFE_MEMCPY_NATIVE_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); } -/* - * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (Ljava/nio/Buffer;JJJ)V - */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2JJJ - (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jlong dstOffset, jlong srcAddress, jlong byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); -} - /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy * Method: memcpy @@ -73,137 +53,127 @@ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava */ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BIJI (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, byteLength, SetByteArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([BJJJ)V - */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BJJJ - (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jlong dstOffset, jlong srcAddress, jlong byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); -} - -/* - * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([SIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SIJI +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3SIJI (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([SJJJ)V + * Method: memcpyAlignDst + * Signature: ([SIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SJJJ - (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jlong dstOffset, jlong srcAddress, jlong byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3SIJI + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jlong srcAddress, jint length) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, length, SetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([CIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CIJI +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3CIJI (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([CJJJ)V + * Method: memcpyAlignDst + * Signature: ([CIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CJJJ - (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jlong dstOffset, jlong srcAddress, jlong byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3CIJI + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jlong srcAddress, jint length) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, length, SetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([IIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IIJI +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3IIJI (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([IJJJ)V + * Method: memcpyAlignDst + * Signature: ([IIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IJJJ - (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jlong dstOffset, jlong srcAddress, jlong byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3IIJI + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jlong srcAddress, jint length) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, length, SetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([JIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JIJI +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3JIJI (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([JJJJ)V + * Method: memcpyAlignDst + * Signature: ([JIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JJJJ - (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jlong dstOffset, jlong srcAddress, jlong byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3JIJI + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jlong srcAddress, jint length) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, length, SetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([DIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DIJI +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3DIJI (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([DJJJ)V + * Method: memcpyAlignDst + * Signature: ([DIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DJJJ - (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jlong dstOffset, jlong srcAddress, jlong byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3DIJI + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jlong srcAddress, jint length) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, length, SetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([FIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FIJI +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3FIJI (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([FJJJ)V + * Method: memcpyAlignDst + * Signature: ([FIJI)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FJJJ - (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jlong dstOffset, jlong srcAddress, jlong byteLength) { - UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3FIJI + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jlong srcAddress, jint length) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, length, SetFloatArrayRegion); } /* @@ -216,16 +186,6 @@ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__JLjav UNSAFE_MEMCPY_BUFFER_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); } -/* - * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (JLjava/nio/Buffer;JJ)V - */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__JLjava_nio_Buffer_2JJ - (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jobject srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); -} - /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy * Method: memcpy @@ -236,16 +196,6 @@ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava UNSAFE_MEMCPY_BUFFER_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); } -/* - * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (Ljava/nio/Buffer;JLjava/nio/Buffer;JJ)V - */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2JLjava_nio_Buffer_2JJ - (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jlong dstOffset, jobject srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); -} - /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy * Method: memcpy @@ -253,137 +203,127 @@ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava */ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BILjava_nio_Buffer_2II (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, byteLength, SetByteArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([BJLjava/nio/Buffer;JJ)V - */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BJLjava_nio_Buffer_2JJ - (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jlong dstOffset, jobject srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); -} - -/* - * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([SILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SILjava_nio_Buffer_2II +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3SILjava_nio_Buffer_2II (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([SJLjava/nio/Buffer;JJ)V + * Method: memcpyAlignDst + * Signature: ([SILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SJLjava_nio_Buffer_2JJ - (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jlong dstOffset, jobject srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3SILjava_nio_Buffer_2II + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, length, SetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([CILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CILjava_nio_Buffer_2II +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3CILjava_nio_Buffer_2II (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([CJLjava/nio/Buffer;JJ)V + * Method: memcpyAlignDst + * Signature: ([CILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CJLjava_nio_Buffer_2JJ - (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jlong dstOffset, jobject srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3CILjava_nio_Buffer_2II + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, length, SetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([IILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IILjava_nio_Buffer_2II +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3IILjava_nio_Buffer_2II (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([IJLjava/nio/Buffer;JJ)V + * Method: memcpyAlignDst + * Signature: ([IILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IJLjava_nio_Buffer_2JJ - (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jlong dstOffset, jobject srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3IILjava_nio_Buffer_2II + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, length, SetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([JILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JILjava_nio_Buffer_2II +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3JILjava_nio_Buffer_2II (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([JJLjava/nio/Buffer;JJ)V + * Method: memcpyAlignDst + * Signature: ([JILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JJLjava_nio_Buffer_2JJ - (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jlong dstOffset, jobject srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3JILjava_nio_Buffer_2II + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, length, SetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([DILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DILjava_nio_Buffer_2II +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3DILjava_nio_Buffer_2II (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([DJLjava/nio/Buffer;JJ)V + * Method: memcpyAlignDst + * Signature: ([DILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DJLjava_nio_Buffer_2JJ - (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jlong dstOffset, jobject srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3DILjava_nio_Buffer_2II + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, length, SetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([FILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FILjava_nio_Buffer_2II +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3FILjava_nio_Buffer_2II (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([FJLjava/nio/Buffer;JJ)V + * Method: memcpyAlignDst + * Signature: ([FILjava/nio/Buffer;II)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FJLjava_nio_Buffer_2JJ - (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jlong dstOffset, jobject srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3FILjava_nio_Buffer_2II + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_BUFFER_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, length, SetFloatArrayRegion); } /* @@ -393,17 +333,7 @@ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FJL */ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3BII (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jbyteArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); -} - -/* - * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (J[BJJ)V - */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3BJJ - (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jbyteArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, byteLength, GetByteArrayRegion); } /* @@ -413,17 +343,7 @@ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3BJ */ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2I_3BII (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); -} - -/* - * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (Ljava/nio/Buffer;J[BJJ)V - */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2J_3BJJ - (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jlong dstOffset, jbyteArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, byteLength, GetByteArrayRegion); } /* @@ -433,1216 +353,1626 @@ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava */ JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BI_3BII (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, byteLength, GetByteArrayRegion, SetByteArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([BJ[BJJ)V - */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BJ_3BJJ - (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jlong dstOffset, jbyteArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); -} - -/* - * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([SI[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SI_3BII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3SI_3BII (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([SJ[BJJ)V + * Method: memcpyAlignDst + * Signature: ([SI[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SJ_3BJJ - (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jlong dstOffset, jbyteArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3SI_3BII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, length, SetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([CI[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CI_3BII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3CI_3BII (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([CJ[BJJ)V + * Method: memcpyAlignDst + * Signature: ([CI[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CJ_3BJJ - (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jlong dstOffset, jbyteArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3CI_3BII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, length, SetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([II[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3II_3BII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3II_3BII (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([IJ[BJJ)V + * Method: memcpyAlignDst + * Signature: ([II[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IJ_3BJJ - (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jlong dstOffset, jbyteArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3II_3BII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, length, SetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([JI[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JI_3BII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3JI_3BII (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([JJ[BJJ)V + * Method: memcpyAlignDst + * Signature: ([JI[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JJ_3BJJ - (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jlong dstOffset, jbyteArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3JI_3BII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, length, SetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([DI[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DI_3BII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3DI_3BII (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([DJ[BJJ)V + * Method: memcpyAlignDst + * Signature: ([DI[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DJ_3BJJ - (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jlong dstOffset, jbyteArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3DI_3BII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, length, SetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([FI[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FI_3BII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3FI_3BII (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([FJ[BJJ)V + * Method: memcpyAlignDst + * Signature: ([FI[BII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FJ_3BJJ - (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jlong dstOffset, jbyteArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3FI_3BII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jbyteArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, length, SetFloatArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: (J[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3SII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__J_3SII (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jshortArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (J[SJJ)V + * Method: memcpyAlignSrc + * Signature: (J[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3SJJ - (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jshortArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__J_3SII + (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, GetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: (Ljava/nio/Buffer;I[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2I_3SII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__Ljava_nio_Buffer_2I_3SII (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (Ljava/nio/Buffer;J[SJJ)V + * Method: memcpyAlignSrc + * Signature: (Ljava/nio/Buffer;I[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2J_3SJJ - (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jlong dstOffset, jshortArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__Ljava_nio_Buffer_2I_3SII + (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, GetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([BI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BI_3SII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3BI_3SII (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([BJ[SJJ)V + * Method: memcpyAlignSrc + * Signature: ([BI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BJ_3SJJ - (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jlong dstOffset, jshortArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3BI_3SII + (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, GetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([SI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SI_3SII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3SI_3SII (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([SJ[SJJ)V + * Method: memcpyAligned + * Signature: ([SI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SJ_3SJJ - (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jlong dstOffset, jshortArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAligned___3SI_3SII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, GetShortArrayRegion, SetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignSrc + * Signature: ([SI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3SI_3SII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, GetShortArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyAlignDst + * Signature: ([SI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3SI_3SII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, SetShortArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([CI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CI_3SII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3CI_3SII (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([CJ[SJJ)V + * Method: memcpyAlignSrc + * Signature: ([CI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CJ_3SJJ - (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jlong dstOffset, jshortArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3CI_3SII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, GetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([CI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3CI_3SII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, SetCharArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([II[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3II_3SII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3II_3SII (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([IJ[SJJ)V + * Method: memcpyAlignSrc + * Signature: ([II[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IJ_3SJJ - (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jlong dstOffset, jshortArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3II_3SII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, GetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([II[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3II_3SII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, SetIntArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([JI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JI_3SII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3JI_3SII (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([JJ[SJJ)V + * Method: memcpyAlignSrc + * Signature: ([JI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JJ_3SJJ - (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jlong dstOffset, jshortArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3JI_3SII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, GetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([JI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3JI_3SII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, SetLongArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([DI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DI_3SII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3DI_3SII (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([DJ[SJJ)V + * Method: memcpyAlignSrc + * Signature: ([DI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DJ_3SJJ - (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jlong dstOffset, jshortArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3DI_3SII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, GetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([DI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3DI_3SII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, SetDoubleArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([FI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FI_3SII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3FI_3SII (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([FJ[SJJ)V + * Method: memcpyAlignSrc + * Signature: ([FI[SII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FJ_3SJJ - (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jlong dstOffset, jshortArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3FI_3SII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, GetShortArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([FI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3FI_3SII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jshortArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, length, SetFloatArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: (J[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3CII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__J_3CII (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jcharArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (J[CJJ)V + * Method: memcpyAlignSrc + * Signature: (J[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3CJJ - (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jcharArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__J_3CII + (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, GetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: (Ljava/nio/Buffer;I[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2I_3CII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__Ljava_nio_Buffer_2I_3CII (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (Ljava/nio/Buffer;J[CJJ)V + * Method: memcpyAlignSrc + * Signature: (Ljava/nio/Buffer;I[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2J_3CJJ - (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jlong dstOffset, jcharArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__Ljava_nio_Buffer_2I_3CII + (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, GetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([BI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BI_3CII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3BI_3CII (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([BJ[CJJ)V + * Method: memcpyAlignSrc + * Signature: ([BI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BJ_3CJJ - (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jlong dstOffset, jcharArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3BI_3CII + (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, GetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([SI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SI_3CII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3SI_3CII (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([SJ[CJJ)V + * Method: memcpyAlignSrc + * Signature: ([SI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SJ_3CJJ - (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jlong dstOffset, jcharArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3SI_3CII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, GetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([SI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3SI_3CII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, SetShortArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([CI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CI_3CII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3CI_3CII (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([CJ[CJJ)V + * Method: memcpyAligned + * Signature: ([CI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CJ_3CJJ - (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jlong dstOffset, jcharArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAligned___3CI_3CII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, GetCharArrayRegion, SetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignSrc + * Signature: ([CI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3CI_3CII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, GetCharArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyAlignDst + * Signature: ([CI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3CI_3CII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, SetCharArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([II[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3II_3CII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3II_3CII (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([IJ[CJJ)V + * Method: memcpyAlignSrc + * Signature: ([II[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IJ_3CJJ - (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jlong dstOffset, jcharArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3II_3CII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, GetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([II[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3II_3CII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, SetIntArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([JI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JI_3CII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3JI_3CII (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([JJ[CJJ)V + * Method: memcpyAlignSrc + * Signature: ([JI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JJ_3CJJ - (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jlong dstOffset, jcharArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3JI_3CII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, GetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([JI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3JI_3CII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, SetLongArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([DI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DI_3CII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3DI_3CII (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([DJ[CJJ)V + * Method: memcpyAlignSrc + * Signature: ([DI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DJ_3CJJ - (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jlong dstOffset, jcharArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3DI_3CII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, GetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([DI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3DI_3CII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, SetDoubleArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([FI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FI_3CII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3FI_3CII (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([FJ[CJJ)V + * Method: memcpyAlignSrc + * Signature: ([FI[CII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FJ_3CJJ - (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jlong dstOffset, jcharArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3FI_3CII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, GetCharArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([FI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3FI_3CII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jcharArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, length, SetFloatArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: (J[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3III +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__J_3III (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jintArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (J[IJJ)V + * Method: memcpyAlignSrc + * Signature: (J[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3IJJ - (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jintArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__J_3III + (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, GetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: (Ljava/nio/Buffer;I[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2I_3III +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__Ljava_nio_Buffer_2I_3III (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (Ljava/nio/Buffer;J[IJJ)V + * Method: memcpyAlignSrc + * Signature: (Ljava/nio/Buffer;I[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2J_3IJJ - (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jlong dstOffset, jintArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__Ljava_nio_Buffer_2I_3III + (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, GetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([BI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BI_3III +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3BI_3III (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([BJ[IJJ)V + * Method: memcpyAlignSrc + * Signature: ([BI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BJ_3IJJ - (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jlong dstOffset, jintArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3BI_3III + (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, GetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([SI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SI_3III +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3SI_3III (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([SJ[IJJ)V + * Method: memcpyAlignSrc + * Signature: ([SI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SJ_3IJJ - (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jlong dstOffset, jintArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3SI_3III + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, GetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([SI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3SI_3III + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, SetShortArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([CI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CI_3III +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3CI_3III (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([CJ[IJJ)V + * Method: memcpyAlignSrc + * Signature: ([CI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CJ_3IJJ - (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jlong dstOffset, jintArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3CI_3III + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, GetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([CI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3CI_3III + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, SetCharArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([II[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3II_3III +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3II_3III (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([IJ[IJJ)V + * Method: memcpyAligned + * Signature: ([II[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IJ_3IJJ - (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jlong dstOffset, jintArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAligned___3II_3III + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, GetIntArrayRegion, SetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignSrc + * Signature: ([II[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3II_3III + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, GetIntArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyAlignDst + * Signature: ([II[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3II_3III + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, SetIntArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([JI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JI_3III +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3JI_3III (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([JJ[IJJ)V + * Method: memcpyAlignSrc + * Signature: ([JI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JJ_3IJJ - (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jlong dstOffset, jintArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3JI_3III + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, GetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([JI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3JI_3III + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, SetLongArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([DI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DI_3III +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3DI_3III (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([DJ[IJJ)V + * Method: memcpyAlignSrc + * Signature: ([DI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DJ_3IJJ - (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jlong dstOffset, jintArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3DI_3III + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, GetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([DI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3DI_3III + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, SetDoubleArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([FI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FI_3III +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3FI_3III (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([FJ[IJJ)V + * Method: memcpyAlignSrc + * Signature: ([FI[III)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FJ_3IJJ - (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jlong dstOffset, jintArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3FI_3III + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, GetIntArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([FI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3FI_3III + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jintArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, length, SetFloatArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: (J[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3JII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__J_3JII (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jlongArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (J[JJJ)V + * Method: memcpyAlignSrc + * Signature: (J[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3JJJ - (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jlongArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__J_3JII + (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, GetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: (Ljava/nio/Buffer;I[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2I_3JII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__Ljava_nio_Buffer_2I_3JII (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (Ljava/nio/Buffer;J[JJJ)V + * Method: memcpyAlignSrc + * Signature: (Ljava/nio/Buffer;I[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2J_3JJJ - (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jlong dstOffset, jlongArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__Ljava_nio_Buffer_2I_3JII + (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, GetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([BI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BI_3JII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3BI_3JII (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([BJ[JJJ)V + * Method: memcpyAlignSrc + * Signature: ([BI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BJ_3JJJ - (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jlong dstOffset, jlongArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3BI_3JII + (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, GetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([SI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SI_3JII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3SI_3JII (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([SJ[JJJ)V + * Method: memcpyAlignSrc + * Signature: ([SI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SJ_3JJJ - (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jlong dstOffset, jlongArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3SI_3JII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, GetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([SI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3SI_3JII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, SetShortArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([CI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CI_3JII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3CI_3JII (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([CJ[JJJ)V + * Method: memcpyAlignSrc + * Signature: ([CI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CJ_3JJJ - (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jlong dstOffset, jlongArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3CI_3JII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, GetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([CI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3CI_3JII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, SetCharArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([II[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3II_3JII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3II_3JII (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([IJ[JJJ)V + * Method: memcpyAlignSrc + * Signature: ([II[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IJ_3JJJ - (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jlong dstOffset, jlongArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3II_3JII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, GetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([II[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3II_3JII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, SetIntArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([JI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JI_3JII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3JI_3JII (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([JJ[JJJ)V + * Method: memcpyAligned + * Signature: ([JI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JJ_3JJJ - (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jlong dstOffset, jlongArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAligned___3JI_3JII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, GetLongArrayRegion, SetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignSrc + * Signature: ([JI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3JI_3JII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, GetLongArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyAlignDst + * Signature: ([JI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3JI_3JII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, SetLongArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([DI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DI_3JII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3DI_3JII (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([DJ[JJJ)V + * Method: memcpyAlignSrc + * Signature: ([DI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DJ_3JJJ - (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jlong dstOffset, jlongArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3DI_3JII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, GetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([DI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3DI_3JII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, SetDoubleArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([FI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FI_3JII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3FI_3JII (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([FJ[JJJ)V + * Method: memcpyAlignSrc + * Signature: ([FI[JII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FJ_3JJJ - (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jlong dstOffset, jlongArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3FI_3JII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, GetLongArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([FI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3FI_3JII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jlongArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, length, SetFloatArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: (J[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3DII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__J_3DII (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jdoubleArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (J[DJJ)V + * Method: memcpyAlignSrc + * Signature: (J[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3DJJ - (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jdoubleArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__J_3DII + (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, GetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: (Ljava/nio/Buffer;I[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2I_3DII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__Ljava_nio_Buffer_2I_3DII (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (Ljava/nio/Buffer;J[DJJ)V + * Method: memcpyAlignSrc + * Signature: (Ljava/nio/Buffer;I[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2J_3DJJ - (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jlong dstOffset, jdoubleArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__Ljava_nio_Buffer_2I_3DII + (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, GetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([BI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BI_3DII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3BI_3DII (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([BJ[DJJ)V + * Method: memcpyAlignSrc + * Signature: ([BI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BJ_3DJJ - (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jlong dstOffset, jdoubleArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3BI_3DII + (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, GetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([SI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SI_3DII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3SI_3DII (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([SJ[DJJ)V + * Method: memcpyAlignSrc + * Signature: ([SI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SJ_3DJJ - (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jlong dstOffset, jdoubleArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3SI_3DII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, GetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([SI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3SI_3DII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, SetShortArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([CI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CI_3DII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3CI_3DII (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([CJ[DJJ)V + * Method: memcpyAlignSrc + * Signature: ([CI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CJ_3DJJ - (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jlong dstOffset, jdoubleArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3CI_3DII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, GetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([CI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3CI_3DII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, SetCharArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([II[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3II_3DII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3II_3DII (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([IJ[DJJ)V + * Method: memcpyAlignSrc + * Signature: ([II[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IJ_3DJJ - (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jlong dstOffset, jdoubleArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3II_3DII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, GetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([II[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3II_3DII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, SetIntArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([JI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JI_3DII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3JI_3DII (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([JJ[DJJ)V + * Method: memcpyAlignSrc + * Signature: ([JI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JJ_3DJJ - (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jlong dstOffset, jdoubleArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3JI_3DII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, GetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([JI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3JI_3DII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, SetLongArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([DI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DI_3DII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3DI_3DII (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([DJ[DJJ)V + * Method: memcpyAligned + * Signature: ([DI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DJ_3DJJ - (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jlong dstOffset, jdoubleArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAligned___3DI_3DII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, GetDoubleArrayRegion, SetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignSrc + * Signature: ([DI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3DI_3DII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, GetDoubleArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyAlignDst + * Signature: ([DI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3DI_3DII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, SetDoubleArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([FI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FI_3DII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3FI_3DII (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([FJ[DJJ)V + * Method: memcpyAlignSrc + * Signature: ([FI[DII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FJ_3DJJ - (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jlong dstOffset, jdoubleArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3FI_3DII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, GetDoubleArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([FI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3FI_3DII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jdoubleArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, length, SetFloatArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: (J[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3FII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__J_3FII (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jfloatArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (J[FJJ)V + * Method: memcpyAlignSrc + * Signature: (J[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__J_3FJJ - (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jfloatArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__J_3FII + (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, GetFloatArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: (Ljava/nio/Buffer;I[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2I_3FII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned__Ljava_nio_Buffer_2I_3FII (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: (Ljava/nio/Buffer;J[FJJ)V + * Method: memcpyAlignSrc + * Signature: (Ljava/nio/Buffer;I[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2J_3FJJ - (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jlong dstOffset, jfloatArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc__Ljava_nio_Buffer_2I_3FII + (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, GetFloatArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([BI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BI_3FII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3BI_3FII (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([BJ[FJJ)V + * Method: memcpyAlignSrc + * Signature: ([BI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3BJ_3FJJ - (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jlong dstOffset, jfloatArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3BI_3FII + (JNIEnv * jniHandle, jclass jniClass, jbyteArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jbyte, GetByteArrayElements, ReleaseByteArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, GetFloatArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyUnaligned * Signature: ([SI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SI_3FII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3SI_3FII (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([SJ[FJJ)V + * Method: memcpyAlignSrc + * Signature: ([SI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SJ_3FJJ - (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jlong dstOffset, jfloatArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3SI_3FII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, GetFloatArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([SI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3SI_3FII + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jshort, GetShortArrayElements, ReleaseShortArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, SetShortArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([CI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CI_3FII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3CI_3FII (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([CJ[FJJ)V + * Method: memcpyAlignSrc + * Signature: ([CI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CJ_3FJJ - (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jlong dstOffset, jfloatArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3CI_3FII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, GetFloatArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([CI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3CI_3FII + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jchar, GetCharArrayElements, ReleaseCharArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, SetCharArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([II[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3II_3FII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3II_3FII (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([IJ[FJJ)V + * Method: memcpyAlignSrc + * Signature: ([II[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IJ_3FJJ - (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jlong dstOffset, jfloatArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3II_3FII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, GetFloatArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([II[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3II_3FII + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jint, GetIntArrayElements, ReleaseIntArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, SetIntArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([JI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JI_3FII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3JI_3FII (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([JJ[FJJ)V + * Method: memcpyAlignSrc + * Signature: ([JI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JJ_3FJJ - (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jlong dstOffset, jfloatArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3JI_3FII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, GetFloatArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([JI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3JI_3FII + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jlong, GetLongArrayElements, ReleaseLongArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, SetLongArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([DI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DI_3FII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3DI_3FII (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([DJ[FJJ)V + * Method: memcpyAlignSrc + * Signature: ([DI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DJ_3FJJ - (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jlong dstOffset, jfloatArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3DI_3FII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, GetFloatArrayRegion); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy + * Method: memcpyAlignDst + * Signature: ([DI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3DI_3FII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jdouble, GetDoubleArrayElements, ReleaseDoubleArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, SetDoubleArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyUnaligned * Signature: ([FI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FI_3FII +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyUnaligned___3FI_3FII (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, byteLength); } /* * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy - * Method: memcpy - * Signature: ([FJ[FJJ)V + * Method: memcpyAligned + * Signature: ([FI[FII)V */ -JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FJ_3FJJ - (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jlong dstOffset, jfloatArray srcAddress, jlong srcOffset, jlong byteLength) { - UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength); +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAligned___3FI_3FII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, GetFloatArrayRegion, SetFloatArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyAlignSrc + * Signature: ([FI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignSrc___3FI_3FII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, GetFloatArrayRegion); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpyAlignDst + * Signature: ([FI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpyAlignDst___3FI_3FII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jfloatArray srcAddress, jint srcOffset, jint length) { + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, srcAddress, srcOffset, jfloat, GetFloatArrayElements, ReleaseFloatArrayElements, length, SetFloatArrayRegion); } diff --git a/native/UnsafeMemcpyImpl.h b/native/UnsafeMemcpyImpl.h index c50db91..8c0fc2f 100644 --- a/native/UnsafeMemcpyImpl.h +++ b/native/UnsafeMemcpyImpl.h @@ -32,9 +32,12 @@ #include "utils.h" + +// =============== UNALIGNED VERSIONS =============== + #define UNSAFE_MEMCPY_IMPL(dst, src, len) memcpy((void*)(dst), (const void*)(src), (size_t)(len)) -#define UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength)\ +#define UNSAFE_MEMCPY_ARRAY_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, srcType, srcGetElements, srcReleaseElements, byteLength)\ uint64_t srcArray = (uint64_t)(*jniHandle)->GetPrimitiveArrayCritical(jniHandle, srcAddress, NULL);\ if(!srcArray) {\ unsafeThrowOutOfMemory(jniHandle);\ @@ -72,7 +75,7 @@ }\ UNSAFE_MEMCPY_IMPL(dstBuffer + dstOffset, srcBuffer + srcOffset, byteLength); -#define UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength)\ +#define UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, srcType, srcGetElements, srcReleaseElements, byteLength)\ uint64_t dstBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, dstAddress);\ if(!dstBuffer) {\ unsafeThrowNotDirectBuffer(jniHandle);\ @@ -86,7 +89,7 @@ UNSAFE_MEMCPY_IMPL(dstBuffer + dstOffset, srcArray + srcOffset, byteLength);\ (*jniHandle)->ReleasePrimitiveArrayCritical(jniHandle, srcAddress, (void*)srcArray, JNI_ABORT); -#define UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength)\ +#define UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, dstType, dstGetElements, dstReleaseElements, srcAddress, byteLength)\ uint64_t dstArray = (uint64_t)(*jniHandle)->GetPrimitiveArrayCritical(jniHandle, dstAddress, NULL);\ if(!dstArray) {\ unsafeThrowOutOfMemory(jniHandle);\ @@ -95,7 +98,7 @@ UNSAFE_MEMCPY_IMPL(dstArray + dstOffset, srcAddress, byteLength);\ (*jniHandle)->ReleasePrimitiveArrayCritical(jniHandle, dstAddress, (void*)dstArray, JNI_COMMIT); -#define UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength)\ +#define UNSAFE_MEMCPY_BUFFER_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, dstType, dstGetElements, dstReleaseElements, srcAddress, srcOffset, byteLength)\ uint64_t srcBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, srcAddress);\ if(!srcBuffer) {\ unsafeThrowNotDirectBuffer(jniHandle);\ @@ -109,7 +112,7 @@ UNSAFE_MEMCPY_IMPL(dstArray + dstOffset, srcBuffer + srcOffset, byteLength);\ (*jniHandle)->ReleasePrimitiveArrayCritical(jniHandle, dstAddress, (void*)dstArray, JNI_COMMIT); -#define UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength)\ +#define UNSAFE_MEMCPY_ARRAY_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, dstType, dstGetElements, dstReleaseElements, srcAddress, srcOffset, srcType, srcGetElements, srcReleaseElements, byteLength)\ uint64_t srcArray = (uint64_t)(*jniHandle)->GetPrimitiveArrayCritical(jniHandle, srcAddress, NULL);\ if(!srcArray) {\ unsafeThrowOutOfMemory(jniHandle);\ @@ -124,3 +127,58 @@ UNSAFE_MEMCPY_IMPL(dstArray + dstOffset, srcArray + srcOffset, byteLength);\ (*jniHandle)->ReleasePrimitiveArrayCritical(jniHandle, dstAddress, (void*)dstArray, JNI_COMMIT);\ (*jniHandle)->ReleasePrimitiveArrayCritical(jniHandle, srcAddress, (void*)srcArray, JNI_ABORT); + + + +// =============== ALIGNED SRC VERSIONS =============== + +#define UNSAFE_MEMCPY_ARRAY_ALIGN_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, srcType, srcGetElements, srcReleaseElements, length, srcGetRegionFunction)\ + (*jniHandle)->srcGetRegionFunction(jniHandle, srcAddress, srcOffset, length, (srcType*)dstAddress); + +#define UNSAFE_MEMCPY_ARRAY_ALIGN_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, srcType, srcGetElements, srcReleaseElements, length, srcGetRegionFunction)\ + uint64_t dstBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, dstAddress);\ + if(!dstBuffer) {\ + unsafeThrowNotDirectBuffer(jniHandle);\ + return;\ + }\ + (*jniHandle)->srcGetRegionFunction(jniHandle, srcAddress, srcOffset, length, (srcType*)(dstBuffer + dstOffset)); + +#define UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, dstType, dstGetElements, dstReleaseElements, srcAddress, srcOffset, srcType, srcGetElements, srcReleaseElements, length, srcGetRegionFunction)\ + uint64_t dstArray = (uint64_t)(*jniHandle)->dstGetElements(jniHandle, dstAddress, NULL);\ + if(!dstArray) {\ + unsafeThrowOutOfMemory(jniHandle);\ + return;\ + }\ + (*jniHandle)->srcGetRegionFunction(jniHandle, srcAddress, srcOffset, length, (srcType*)(dstArray + dstOffset));\ + (*jniHandle)->dstReleaseElements(jniHandle, dstAddress, (dstType*)dstArray, JNI_COMMIT);\ + + + +// =============== ALIGNED DST VERSIONS =============== + +#define UNSAFE_MEMCPY_NATIVE_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, dstType, dstGetElements, dstReleaseElements, srcAddress, length, dstSetRegionFunction)\ + (*jniHandle)->dstSetRegionFunction(jniHandle, dstAddress, dstOffset, length, (const dstType*)srcAddress); + +#define UNSAFE_MEMCPY_BUFFER_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, dstType, dstGetElements, dstReleaseElements, srcAddress, srcOffset, length, dstSetRegionFunction)\ + uint64_t srcBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, srcAddress);\ + if(!srcBuffer) {\ + unsafeThrowNotDirectBuffer(jniHandle);\ + return;\ + }\ + (*jniHandle)->dstSetRegionFunction(jniHandle, dstAddress, dstOffset, length, (const dstType*)(srcBuffer + srcOffset)); + +#define UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, dstType, dstGetElements, dstReleaseElements, srcAddress, srcOffset, srcType, srcGetElements, srcReleaseElements, length, dstSetRegionFunction)\ + uint64_t srcArray = (uint64_t)(*jniHandle)->srcGetElements(jniHandle, srcAddress, NULL);\ + if(!srcArray) {\ + unsafeThrowOutOfMemory(jniHandle);\ + return;\ + }\ + (*jniHandle)->dstSetRegionFunction(jniHandle, dstAddress, dstOffset, length, (const dstType*)(srcArray + srcOffset));\ + (*jniHandle)->srcReleaseElements(jniHandle, srcAddress, (void*)srcArray, JNI_ABORT); + + + +// =============== FULLY ALIGNED VERSIONS =============== + +#define UNSAFE_MEMCPY_ARRAY_ALIGN_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, dstType, dstGetElements, dstReleaseElements, srcAddress, srcOffset, srcType, srcGetElements, srcReleaseElements, length, srcGetRegionFunction, dstSetRegionFunction)\ + UNSAFE_MEMCPY_ARRAY_TO_ARRAY_ALIGN_IMPL(jniHandle, dstAddress, dstOffset, dstType, dstGetElements, dstReleaseElements, srcAddress, (srcOffset * (jsize)sizeof(srcType)), srcType, srcGetElements, srcReleaseElements, length, dstSetRegionFunction)