From f4917d435a8086f13525d29b14f52d1e5b45093e Mon Sep 17 00:00:00 2001 From: lax1dude Date: Wed, 10 Apr 2024 19:57:21 -0700 Subject: [PATCH] upload source --- LICENSE | 24 + README.md | 7 + UnsafeMemcpy.dll | Bin 0 -> 128000 bytes UnsafeMemcpy.jar | Bin 0 -> 3359 bytes .../lax1dude/unsafememcpy/UnsafeMalloc.java | 70 + .../lax1dude/unsafememcpy/UnsafeMemcpy.java | 361 ++++ .../lax1dude/unsafememcpy/UnsafeMemset.java | 73 + .../lax1dude/unsafememcpy/UnsafeUtils.java | 85 + native/UnsafeMalloc.c | 234 +++ native/UnsafeMemcpy.c | 1648 +++++++++++++++++ native/UnsafeMemcpyImpl.h | 126 ++ native/UnsafeMemset.c | 208 +++ native/UnsafeMemsetImpl.h | 53 + native/UnsafeUtils.c | 224 +++ native/utils.c | 43 + native/utils.h | 35 + 16 files changed, 3191 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 UnsafeMemcpy.dll create mode 100644 UnsafeMemcpy.jar create mode 100644 java/net/lax1dude/unsafememcpy/UnsafeMalloc.java create mode 100644 java/net/lax1dude/unsafememcpy/UnsafeMemcpy.java create mode 100644 java/net/lax1dude/unsafememcpy/UnsafeMemset.java create mode 100644 java/net/lax1dude/unsafememcpy/UnsafeUtils.java create mode 100644 native/UnsafeMalloc.c create mode 100644 native/UnsafeMemcpy.c create mode 100644 native/UnsafeMemcpyImpl.h create mode 100644 native/UnsafeMemset.c create mode 100644 native/UnsafeMemsetImpl.h create mode 100644 native/UnsafeUtils.c create mode 100644 native/utils.c create mode 100644 native/utils.h diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5dd8ade --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ + +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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6c84d07 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +### Unsafe Memcpy for Java + +Fast JNI library to copy arbitrary data from native code into and out of primitive arrays in Java. + +You probably don't need this. + +Compiling instructions coming later. \ No newline at end of file diff --git a/UnsafeMemcpy.dll b/UnsafeMemcpy.dll new file mode 100644 index 0000000000000000000000000000000000000000..0746243324e3feaefff27a3074cda7f115c39698 GIT binary patch literal 128000 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 literal 0 HcmV?d00001 diff --git a/UnsafeMemcpy.jar b/UnsafeMemcpy.jar new file mode 100644 index 0000000000000000000000000000000000000000..9298c39db02c86168019e4c3634c9a9232949cec GIT binary patch literal 3359 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 literal 0 HcmV?d00001 diff --git a/java/net/lax1dude/unsafememcpy/UnsafeMalloc.java b/java/net/lax1dude/unsafememcpy/UnsafeMalloc.java new file mode 100644 index 0000000..d39f523 --- /dev/null +++ b/java/net/lax1dude/unsafememcpy/UnsafeMalloc.java @@ -0,0 +1,70 @@ +/* + * 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; + +import java.nio.Buffer; +import java.nio.ByteBuffer; + +public class UnsafeMalloc { + + static { + UnsafeUtils.loadNatives(); + } + + public static native long malloc(int size); + + public static native long malloc(long size); + + public static native long calloc(int num, int size); + + public static native long calloc(long num, long size); + + public static native long realloc(long oldPtr, int size); + + public static native long realloc(long oldPtr, long size); + + public static native void free(long ptr); + + public static native ByteBuffer mallocBuffer(int size); + + public static native ByteBuffer mallocBuffer(long size); + + public static native ByteBuffer callocBuffer(int num, int size); + + public static native ByteBuffer callocBuffer(long num, long size); + + public static native ByteBuffer reallocBuffer(long oldPtr, int size); + + public static native ByteBuffer reallocBuffer(long oldPtr, long size); + + public static native ByteBuffer reallocBuffer(Buffer oldBuffer, int size); + + public static native ByteBuffer reallocBuffer(Buffer oldBuffer, long size); + + public static native void freeBuffer(Buffer buffer); + +} diff --git a/java/net/lax1dude/unsafememcpy/UnsafeMemcpy.java b/java/net/lax1dude/unsafememcpy/UnsafeMemcpy.java new file mode 100644 index 0000000..a3bed39 --- /dev/null +++ b/java/net/lax1dude/unsafememcpy/UnsafeMemcpy.java @@ -0,0 +1,361 @@ +/* + * 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; + +import java.nio.Buffer; + +public class UnsafeMemcpy { + + static { + UnsafeUtils.loadNatives(); + } + + 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 memcpy(short[] dstAddress, int dstOffset, long srcAddress, int byteLength); + + public static native void memcpy(short[] dstAddress, long dstOffset, long srcAddress, long byteLength); + + public static native void memcpy(char[] dstAddress, int dstOffset, long srcAddress, int byteLength); + + public static native void memcpy(char[] dstAddress, long dstOffset, long srcAddress, long byteLength); + + public static native void memcpy(int[] dstAddress, int dstOffset, long srcAddress, int byteLength); + + public static native void memcpy(int[] dstAddress, long dstOffset, long srcAddress, long byteLength); + + public static native void memcpy(long[] dstAddress, int dstOffset, long srcAddress, int byteLength); + + public static native void memcpy(long[] dstAddress, long dstOffset, long srcAddress, long byteLength); + + public static native void memcpy(double[] dstAddress, int dstOffset, long srcAddress, int byteLength); + + public static native void memcpy(double[] dstAddress, long dstOffset, long srcAddress, long 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 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 memcpy(short[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(short[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(char[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(char[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(int[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(int[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(double[] dstAddress, int dstOffset, Buffer srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(double[] dstAddress, long dstOffset, Buffer srcAddress, long srcOffset, long 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 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 memcpy(short[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(short[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(char[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(char[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(int[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(int[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(double[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(double[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(float[] dstAddress, int dstOffset, byte[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(float[] dstAddress, long dstOffset, byte[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long dstAddress, short[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long dstAddress, short[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(Buffer dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(Buffer dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(byte[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(byte[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(short[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(short[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(char[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(char[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(int[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(int[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long[] 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 memcpy(double[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(double[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(float[] dstAddress, int dstOffset, short[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(float[] dstAddress, long dstOffset, short[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long dstAddress, char[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long dstAddress, char[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(Buffer dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(Buffer dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(byte[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(byte[] dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(short[] dstAddress, int dstOffset, 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 memcpy(char[] 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 memcpy(int[] 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 memcpy(long[] 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 memcpy(double[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(double[] dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(float[] dstAddress, int dstOffset, char[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(float[] dstAddress, long dstOffset, char[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long dstAddress, int[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long dstAddress, int[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(Buffer dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(Buffer dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(byte[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(byte[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(short[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(short[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(char[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(char[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(int[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(int[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(double[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(double[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(float[] dstAddress, int dstOffset, int[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(float[] dstAddress, long dstOffset, int[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long dstAddress, long[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long dstAddress, long[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(Buffer dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(Buffer dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(byte[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(byte[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(short[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(short[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(char[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(char[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(int[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(int[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(double[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(double[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(float[] dstAddress, int dstOffset, long[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(float[] dstAddress, long dstOffset, long[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long dstAddress, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long dstAddress, double[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(Buffer dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(Buffer dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(byte[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(byte[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(short[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(short[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(char[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(char[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(int[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(int[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(double[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(double[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(float[] dstAddress, int dstOffset, double[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(float[] dstAddress, long dstOffset, double[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long dstAddress, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long dstAddress, float[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(Buffer dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(Buffer dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(byte[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(byte[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(short[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(short[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(char[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(char[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(int[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(int[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(long[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(long[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(double[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(double[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + + public static native void memcpy(float[] dstAddress, int dstOffset, float[] srcAddress, int srcOffset, int byteLength); + + public static native void memcpy(float[] dstAddress, long dstOffset, float[] srcAddress, long srcOffset, long byteLength); + +} diff --git a/java/net/lax1dude/unsafememcpy/UnsafeMemset.java b/java/net/lax1dude/unsafememcpy/UnsafeMemset.java new file mode 100644 index 0000000..0a8026c --- /dev/null +++ b/java/net/lax1dude/unsafememcpy/UnsafeMemset.java @@ -0,0 +1,73 @@ +/* + * 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; + +import java.nio.Buffer; + +public class UnsafeMemset { + + static { + UnsafeUtils.loadNatives(); + } + + public static native void memset(long address, int value, int byteLength); + + public static native void memset(long address, int value, long byteLength); + + public static native void memset(Buffer address, int offset, int value, int byteLength); + + public static native void memset(Buffer address, long offset, int value, long byteLength); + + public static native void memset(byte[] address, int offset, int value, int byteLength); + + public static native void memset(byte[] address, long offset, int value, long byteLength); + + public static native void memset(short[] address, int offset, int value, int byteLength); + + public static native void memset(short[] address, long offset, int value, long byteLength); + + public static native void memset(char[] address, int offset, int value, int byteLength); + + public static native void memset(char[] address, long offset, int value, long byteLength); + + public static native void memset(int[] address, int offset, int value, int byteLength); + + public static native void memset(int[] address, long offset, int value, long byteLength); + + public static native void memset(long[] address, int offset, int value, int byteLength); + + public static native void memset(long[] address, long offset, int value, long byteLength); + + public static native void memset(double[] address, int offset, int value, int byteLength); + + public static native void memset(double[] address, long offset, int value, long byteLength); + + public static native void memset(float[] address, int offset, int value, int byteLength); + + public static native void memset(float[] address, long offset, int value, long byteLength); + +} diff --git a/java/net/lax1dude/unsafememcpy/UnsafeUtils.java b/java/net/lax1dude/unsafememcpy/UnsafeUtils.java new file mode 100644 index 0000000..df366e0 --- /dev/null +++ b/java/net/lax1dude/unsafememcpy/UnsafeUtils.java @@ -0,0 +1,85 @@ +/* + * 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; + +import java.nio.Buffer; +import java.nio.ByteBuffer; + +public class UnsafeUtils { + + private static boolean hasLoadedNatives = false; + + static { + loadNatives(); + } + + public static void loadNatives() { + if(!hasLoadedNatives) { + hasLoadedNatives = true; + System.loadLibrary("UnsafeMemcpy"); + } + } + + public static native int getVersionMajor(); + + public static native int getVersionMinor(); + + public static native ByteBuffer makeDirectBuffer(long address, int size); + + public static native ByteBuffer makeDirectBuffer(long address, long size); + + public static native long getAddress(Buffer buffer); + + public static native byte getMemByte(long address); + + public static native short getMemShort(long address); + + public static native char getMemChar(long address); + + public static native int getMemInt(long address); + + public static native long getMemLong(long address); + + public static native double getMemDouble(long address); + + public static native float getMemFloat(long address); + + public static native void setMemByte(long address, byte value); + + public static native void setMemShort(long address, short value); + + public static native void setMemChar(long address, char value); + + public static native void setMemInt(long address, int value); + + public static native void setMemLong(long address, long value); + + public static native void setMemDouble(long address, double value); + + public static native void setMemFloat(long address, float value); + +} diff --git a/native/UnsafeMalloc.c b/native/UnsafeMalloc.c new file mode 100644 index 0000000..745397f --- /dev/null +++ b/native/UnsafeMalloc.c @@ -0,0 +1,234 @@ +/* + * 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 "UnsafeMallocImpl.h" + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: malloc + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_malloc__I + (JNIEnv * jniHandle, jclass jniClass, jint size) { + return (jlong)UNSAFE_MALLOC_IMPL(size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: malloc + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_malloc__J + (JNIEnv * jniHandle, jclass jniClass, jlong size) { + return (jlong)UNSAFE_MALLOC_IMPL(size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: calloc + * Signature: (II)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_calloc__II + (JNIEnv * jniHandle, jclass jniClass, jint num, jint size) { + return (jlong)UNSAFE_CALLOC_IMPL(num, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: calloc + * Signature: (JJ)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_calloc__JJ + (JNIEnv * jniHandle, jclass jniClass, jlong num, jlong size) { + return (jlong)UNSAFE_CALLOC_IMPL(num, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: realloc + * Signature: (JI)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_realloc__JI + (JNIEnv * jniHandle, jclass jniClass, jlong address, jint size) { + return (jlong)UNSAFE_REALLOC_IMPL(address, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: realloc + * Signature: (JJ)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_realloc__JJ + (JNIEnv * jniHandle, jclass jniClass, jlong address, jlong size) { + return (jlong)UNSAFE_REALLOC_IMPL(address, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: free + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_free + (JNIEnv * jniHandle, jclass jniClass, jlong address) { + UNSAFE_FREE_IMPL(address); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: mallocBuffer + * Signature: (I)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_mallocBuffer__I + (JNIEnv * jniHandle, jclass jniClass, jint size) { + void* ret = UNSAFE_MALLOC_IMPL(size); + if(!ret) { + return NULL; + } + return (*jniHandle)->NewDirectByteBuffer(jniHandle, ret, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: mallocBuffer + * Signature: (J)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_mallocBuffer__J + (JNIEnv * jniHandle, jclass jniClass, jlong size) { + void* ret = UNSAFE_MALLOC_IMPL(size); + if(!ret) { + return NULL; + } + return (*jniHandle)->NewDirectByteBuffer(jniHandle, ret, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: callocBuffer + * Signature: (II)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_callocBuffer__II + (JNIEnv * jniHandle, jclass jniClass, jint num, jint size) { + void* ret = UNSAFE_CALLOC_IMPL(num, size); + if(!ret) { + return NULL; + } + return (*jniHandle)->NewDirectByteBuffer(jniHandle, ret, num * size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: callocBuffer + * Signature: (JJ)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_callocBuffer__JJ + (JNIEnv * jniHandle, jclass jniClass, jlong num, jlong size) { + void* ret = UNSAFE_CALLOC_IMPL(num, size); + if(!ret) { + return NULL; + } + return (*jniHandle)->NewDirectByteBuffer(jniHandle, ret, num * size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: reallocBuffer + * Signature: (JI)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_reallocBuffer__JI + (JNIEnv * jniHandle, jclass jniClass, jlong address, jint size) { + void* ret = UNSAFE_REALLOC_IMPL(address, size); + if(!ret) { + return NULL; + } + return (*jniHandle)->NewDirectByteBuffer(jniHandle, ret, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: reallocBuffer + * Signature: (JJ)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_reallocBuffer__JJ + (JNIEnv * jniHandle, jclass jniClass, jlong address, jlong size) { + void* ret = UNSAFE_REALLOC_IMPL(address, size); + if(!ret) { + return NULL; + } + return (*jniHandle)->NewDirectByteBuffer(jniHandle, ret, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: reallocBuffer + * Signature: (Ljava/nio/Buffer;I)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_reallocBuffer__Ljava_nio_Buffer_2I + (JNIEnv * jniHandle, jclass jniClass, jobject buffer, jint size) { + void* srcBuffer = (*jniHandle)->GetDirectBufferAddress(jniHandle, buffer); + if(srcBuffer == NULL) { + unsafeThrowNotDirectBuffer(jniHandle); + return NULL; + } + void* ret = UNSAFE_REALLOC_IMPL(srcBuffer, size); + if(!ret) { + return NULL; + } + return (*jniHandle)->NewDirectByteBuffer(jniHandle, ret, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: reallocBuffer + * Signature: (Ljava/nio/Buffer;J)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_reallocBuffer__Ljava_nio_Buffer_2J + (JNIEnv * jniHandle, jclass jniClass, jobject buffer, jlong size) { + void* srcBuffer = (*jniHandle)->GetDirectBufferAddress(jniHandle, buffer); + if(srcBuffer == NULL) { + unsafeThrowNotDirectBuffer(jniHandle); + return NULL; + } + void* ret = UNSAFE_REALLOC_IMPL(srcBuffer, size); + if(!ret) { + return NULL; + } + return (*jniHandle)->NewDirectByteBuffer(jniHandle, ret, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMalloc + * Method: freeBuffer + * Signature: (Ljava/nio/Buffer;)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMalloc_freeBuffer + (JNIEnv * jniHandle, jclass jniClass, jobject buffer) { + void* srcBuffer = (*jniHandle)->GetDirectBufferAddress(jniHandle, buffer); + if(srcBuffer == NULL) { + unsafeThrowNotDirectBuffer(jniHandle); + return; + } + UNSAFE_FREE_IMPL(srcBuffer); +} diff --git a/native/UnsafeMemcpy.c b/native/UnsafeMemcpy.c new file mode 100644 index 0000000..4cb688e --- /dev/null +++ b/native/UnsafeMemcpy.c @@ -0,0 +1,1648 @@ +/* + * 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 "UnsafeMemcpyImpl.h" + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (JJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__JJI + (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jlong srcAddress, jint byteLength) { + 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 + * Signature: (Ljava/nio/Buffer;IJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2IJI + (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { + 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 + * Signature: ([BIJI)V + */ +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); +} + +/* + * 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 + * Signature: ([SIJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3SIJI + (JNIEnv * jniHandle, jclass jniClass, jshortArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SJJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CIJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3CIJI + (JNIEnv * jniHandle, jclass jniClass, jcharArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CJJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IIJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3IIJI + (JNIEnv * jniHandle, jclass jniClass, jintArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IJJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JIJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3JIJI + (JNIEnv * jniHandle, jclass jniClass, jlongArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JJJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DIJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3DIJI + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DJJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FIJI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___3FIJI + (JNIEnv * jniHandle, jclass jniClass, jfloatArray dstAddress, jint dstOffset, jlong srcAddress, jint byteLength) { + UNSAFE_MEMCPY_NATIVE_TO_ARRAY_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FJJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (JLjava/nio/Buffer;II)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__JLjava_nio_Buffer_2II + (JNIEnv * jniHandle, jclass jniClass, jlong dstAddress, jobject srcAddress, jint srcOffset, jint byteLength) { + 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 + * Signature: (Ljava/nio/Buffer;ILjava/nio/Buffer;II)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__Ljava_nio_Buffer_2ILjava_nio_Buffer_2II + (JNIEnv * jniHandle, jclass jniClass, jobject dstAddress, jint dstOffset, jobject srcAddress, jint srcOffset, jint byteLength) { + 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 + * Signature: ([BILjava/nio/Buffer;II)V + */ +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); +} + +/* + * 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 + * Signature: ([SILjava/nio/Buffer;II)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SJLjava/nio/Buffer;JJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CILjava/nio/Buffer;II)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CJLjava/nio/Buffer;JJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IILjava/nio/Buffer;II)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IJLjava/nio/Buffer;JJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JILjava/nio/Buffer;II)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JJLjava/nio/Buffer;JJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DILjava/nio/Buffer;II)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DJLjava/nio/Buffer;JJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FILjava/nio/Buffer;II)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FJLjava/nio/Buffer;JJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[BII)V + */ +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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;I[BII)V + */ +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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BI[BII)V + */ +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); +} + +/* + * 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 + * Signature: ([SI[BII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SJ[BJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CI[BII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CJ[BJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([II[BII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IJ[BJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JI[BII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JJ[BJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DI[BII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DJ[BJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FI[BII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FJ[BJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[SJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;I[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;J[SJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BJ[SJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SJ[SJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CJ[SJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([II[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IJ[SJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JJ[SJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DJ[SJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FI[SII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FJ[SJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[CJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;I[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;J[CJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BJ[CJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SJ[CJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CJ[CJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([II[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IJ[CJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JJ[CJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DJ[CJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FI[CII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FJ[CJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[IJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;I[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;J[IJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BJ[IJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SJ[IJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CJ[IJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([II[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IJ[IJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JJ[IJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DJ[IJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FI[III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FJ[IJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[JJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;I[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;J[JJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BJ[JJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SJ[JJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CJ[JJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([II[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IJ[JJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JJ[JJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DJ[JJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FI[JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FJ[JJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[DJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;I[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;J[DJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BJ[DJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SJ[DJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CJ[DJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([II[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IJ[DJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JJ[DJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DJ[DJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FI[DII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FJ[DJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (J[FJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;I[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy__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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: (Ljava/nio/Buffer;J[FJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([BJ[FJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([SJ[FJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([CJ[FJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([II[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([IJ[FJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([JJ[FJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([DJ[FJJ)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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FI[FII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemcpy_memcpy___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); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemcpy + * Method: memcpy + * Signature: ([FJ[FJJ)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); +} + diff --git a/native/UnsafeMemcpyImpl.h b/native/UnsafeMemcpyImpl.h new file mode 100644 index 0000000..c50db91 --- /dev/null +++ b/native/UnsafeMemcpyImpl.h @@ -0,0 +1,126 @@ +/* + * 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 + +#include "utils.h" + +#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)\ + uint64_t srcArray = (uint64_t)(*jniHandle)->GetPrimitiveArrayCritical(jniHandle, srcAddress, NULL);\ + if(!srcArray) {\ + unsafeThrowOutOfMemory(jniHandle);\ + return;\ + }\ + UNSAFE_MEMCPY_IMPL(dstAddress, srcArray + srcOffset, byteLength);\ + (*jniHandle)->ReleasePrimitiveArrayCritical(jniHandle, srcAddress, (void*)srcArray, JNI_ABORT); + +#define UNSAFE_MEMCPY_BUFFER_TO_NATIVE_IMPL(jniHandle, dstAddress, srcAddress, srcOffset, byteLength)\ + uint64_t srcBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, srcAddress);\ + if(!srcBuffer) {\ + unsafeThrowNotDirectBuffer(jniHandle);\ + return;\ + }\ + UNSAFE_MEMCPY_IMPL(dstAddress, srcBuffer + srcOffset, byteLength); + +#define UNSAFE_MEMCPY_NATIVE_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, byteLength)\ + uint64_t dstBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, dstAddress);\ + if(!dstBuffer) {\ + unsafeThrowNotDirectBuffer(jniHandle);\ + return;\ + }\ + UNSAFE_MEMCPY_IMPL(dstBuffer + dstOffset, srcAddress, byteLength); + +#define UNSAFE_MEMCPY_BUFFER_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength)\ + uint64_t dstBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, dstAddress);\ + if(!dstBuffer) {\ + unsafeThrowNotDirectBuffer(jniHandle);\ + return;\ + }\ + uint64_t srcBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, srcAddress);\ + if(!srcBuffer) {\ + unsafeThrowNotDirectBuffer(jniHandle);\ + return;\ + }\ + UNSAFE_MEMCPY_IMPL(dstBuffer + dstOffset, srcBuffer + srcOffset, byteLength); + +#define UNSAFE_MEMCPY_ARRAY_TO_BUFFER_IMPL(jniHandle, dstAddress, dstOffset, srcAddress, srcOffset, byteLength)\ + uint64_t dstBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, dstAddress);\ + if(!dstBuffer) {\ + unsafeThrowNotDirectBuffer(jniHandle);\ + return;\ + }\ + uint64_t srcArray = (uint64_t)(*jniHandle)->GetPrimitiveArrayCritical(jniHandle, srcAddress, NULL);\ + if(!srcArray) {\ + unsafeThrowOutOfMemory(jniHandle);\ + return;\ + }\ + 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)\ + uint64_t dstArray = (uint64_t)(*jniHandle)->GetPrimitiveArrayCritical(jniHandle, dstAddress, NULL);\ + if(!dstArray) {\ + unsafeThrowOutOfMemory(jniHandle);\ + return;\ + }\ + 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)\ + uint64_t srcBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, srcAddress);\ + if(!srcBuffer) {\ + unsafeThrowNotDirectBuffer(jniHandle);\ + return;\ + }\ + uint64_t dstArray = (uint64_t)(*jniHandle)->GetPrimitiveArrayCritical(jniHandle, dstAddress, NULL);\ + if(!dstArray) {\ + unsafeThrowOutOfMemory(jniHandle);\ + return;\ + }\ + 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)\ + uint64_t srcArray = (uint64_t)(*jniHandle)->GetPrimitiveArrayCritical(jniHandle, srcAddress, NULL);\ + if(!srcArray) {\ + unsafeThrowOutOfMemory(jniHandle);\ + return;\ + }\ + uint64_t dstArray = (uint64_t)(*jniHandle)->GetPrimitiveArrayCritical(jniHandle, dstAddress, NULL);\ + if(!dstArray) {\ + (*jniHandle)->ReleasePrimitiveArrayCritical(jniHandle, srcAddress, (void*)srcArray, JNI_ABORT);\ + unsafeThrowOutOfMemory(jniHandle);\ + return;\ + }\ + UNSAFE_MEMCPY_IMPL(dstArray + dstOffset, srcArray + srcOffset, byteLength);\ + (*jniHandle)->ReleasePrimitiveArrayCritical(jniHandle, dstAddress, (void*)dstArray, JNI_COMMIT);\ + (*jniHandle)->ReleasePrimitiveArrayCritical(jniHandle, srcAddress, (void*)srcArray, JNI_ABORT); diff --git a/native/UnsafeMemset.c b/native/UnsafeMemset.c new file mode 100644 index 0000000..64286ed --- /dev/null +++ b/native/UnsafeMemset.c @@ -0,0 +1,208 @@ +/* + * 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 "UnsafeMemsetImpl.h" + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: (JII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset__JII + (JNIEnv * jniHandle, jclass jniClass, jlong address, jint value, jint byteLength) { + UNSAFE_MEMSET_IMPL(address, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: (JIJ)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset__JIJ + (JNIEnv * jniHandle, jclass jniClass, jlong address, jint value, jlong byteLength) { + UNSAFE_MEMSET_IMPL(address, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: (Ljava/nio/Buffer;III)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset__Ljava_nio_Buffer_2III + (JNIEnv * jniHandle, jclass jniClass, jobject address, jint offset, jint value, jint byteLength) { + UNSAFE_MEMSET_BUFFER_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: (Ljava/nio/Buffer;JIJ)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset__Ljava_nio_Buffer_2JIJ + (JNIEnv * jniHandle, jclass jniClass, jobject address, jlong offset, jint value, jlong byteLength) { + UNSAFE_MEMSET_BUFFER_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([BIII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3BIII + (JNIEnv * jniHandle, jclass jniClass, jbyteArray address, jint offset, jint value, jint byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([BJIJ)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3BJIJ + (JNIEnv * jniHandle, jclass jniClass, jbyteArray address, jlong offset, jint value, jlong byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([SIII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3SIII + (JNIEnv * jniHandle, jclass jniClass, jshortArray address, jint offset, jint value, jint byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([SJIJ)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3SJIJ + (JNIEnv * jniHandle, jclass jniClass, jshortArray address, jlong offset, jint value, jlong byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([CIII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3CIII + (JNIEnv * jniHandle, jclass jniClass, jcharArray address, jint offset, jint value, jint byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([CJIJ)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3CJIJ + (JNIEnv * jniHandle, jclass jniClass, jcharArray address, jlong offset, jint value, jlong byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([IIII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3IIII + (JNIEnv * jniHandle, jclass jniClass, jintArray address, jint offset, jint value, jint byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([IJIJ)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3IJIJ + (JNIEnv * jniHandle, jclass jniClass, jintArray address, jlong offset, jint value, jlong byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([JIII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3JIII + (JNIEnv * jniHandle, jclass jniClass, jlongArray address, jint offset, jint value, jint byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([JJIJ)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3JJIJ + (JNIEnv * jniHandle, jclass jniClass, jlongArray address, jlong offset, jint value, jlong byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([DIII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3DIII + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray address, jint offset, jint value, jint byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([DJIJ)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3DJIJ + (JNIEnv * jniHandle, jclass jniClass, jdoubleArray address, jlong offset, jint value, jlong byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([FIII)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3FIII + (JNIEnv * jniHandle, jclass jniClass, jfloatArray address, jint offset, jint value, jint byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeMemset + * Method: memset + * Signature: ([FJIJ)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeMemset_memset___3FJIJ + (JNIEnv * jniHandle, jclass jniClass, jfloatArray address, jlong offset, jint value, jlong byteLength) { + UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength); +} + diff --git a/native/UnsafeMemsetImpl.h b/native/UnsafeMemsetImpl.h new file mode 100644 index 0000000..c279367 --- /dev/null +++ b/native/UnsafeMemsetImpl.h @@ -0,0 +1,53 @@ +/* + * 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 + +#include "utils.h" + +#define UNSAFE_MEMSET_IMPL(address, value, byteLength)\ + memset((void*)(address), (int)(value), (size_t)(byteLength)); + +#define UNSAFE_MEMSET_BUFFER_IMPL(jniHandle, address, offset, value, byteLength)\ + uint64_t dstBuffer = (uint64_t)(*jniHandle)->GetDirectBufferAddress(jniHandle, address);\ + if(!dstBuffer) {\ + unsafeThrowNotDirectBuffer(jniHandle);\ + return;\ + }\ + UNSAFE_MEMSET_IMPL(dstBuffer + offset, value, byteLength); + +#define UNSAFE_MEMSET_ARRAY_IMPL(jniHandle, address, offset, value, byteLength)\ + uint64_t dstArray = (uint64_t)(*jniHandle)->GetPrimitiveArrayCritical(jniHandle, address, NULL);\ + if(!dstArray) {\ + unsafeThrowOutOfMemory(jniHandle);\ + return;\ + }\ + UNSAFE_MEMSET_IMPL(dstArray + offset, value, byteLength);\ + (*jniHandle)->ReleasePrimitiveArrayCritical(jniHandle, address, (void*)dstArray, JNI_COMMIT); diff --git a/native/UnsafeUtils.c b/native/UnsafeUtils.c new file mode 100644 index 0000000..1a92b7c --- /dev/null +++ b/native/UnsafeUtils.c @@ -0,0 +1,224 @@ +/* + * 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 + +#include "utils.h" + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: getVersionMajor + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_getVersionMajor + (JNIEnv * jniHandle, jclass jniClass) { + return NATIVE_LIBRARY_VERSION_MAJOR; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: getVersionMinor + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_getVersionMinor + (JNIEnv * jniHandle, jclass jniClass) { + return NATIVE_LIBRARY_VERSION_MINOR; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: makeDirectBuffer + * Signature: (JI)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_makeDirectBuffer__JI + (JNIEnv * jniHandle, jclass jniClass, jlong address, jint size) { + return (*jniHandle)->NewDirectByteBuffer(jniHandle, (void*)address, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: makeDirectBuffer + * Signature: (JJ)Ljava/nio/ByteBuffer; + */ +JNIEXPORT jobject JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_makeDirectBuffer__JJ + (JNIEnv * jniHandle, jclass jniClass, jlong address, jlong size) { + return (*jniHandle)->NewDirectByteBuffer(jniHandle, (void*)address, size); +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: getAddress + * Signature: (Ljava/nio/Buffer;)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_getAddress + (JNIEnv * jniHandle, jclass jniClass, jobject buffer) { + void* srcBuffer = (*jniHandle)->GetDirectBufferAddress(jniHandle, buffer); + if(srcBuffer == NULL) { + unsafeThrowNotDirectBuffer(jniHandle); + return 0; + } + return (jlong)srcBuffer; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: getMemByte + * Signature: (J)B + */ +JNIEXPORT jbyte JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_getMemByte + (JNIEnv * jniHandle, jclass jniClass, jlong address) { + return *(jbyte*)address; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: getMemShort + * Signature: (J)S + */ +JNIEXPORT jshort JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_getMemShort + (JNIEnv * jniHandle, jclass jniClass, jlong address) { + return *(jshort*)address; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: getMemChar + * Signature: (J)C + */ +JNIEXPORT jchar JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_getMemChar + (JNIEnv * jniHandle, jclass jniClass, jlong address) { + return *(jchar*)address; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: getMemInt + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_getMemInt + (JNIEnv * jniHandle, jclass jniClass, jlong address) { + return *(jint*)address; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: getMemLong + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_getMemLong + (JNIEnv * jniHandle, jclass jniClass, jlong address) { + return *(jlong*)address; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: getMemDouble + * Signature: (J)D + */ +JNIEXPORT jdouble JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_getMemDouble + (JNIEnv * jniHandle, jclass jniClass, jlong address) { + return *(jdouble*)address; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: getMemFloat + * Signature: (J)F + */ +JNIEXPORT jfloat JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_getMemFloat + (JNIEnv * jniHandle, jclass jniClass, jlong address) { + return *(jfloat*)address; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: setMemByte + * Signature: (JB)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_setMemByte + (JNIEnv * jniHandle, jclass jniClass, jlong address, jbyte value) { + *(jbyte*)address = value; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: setMemShort + * Signature: (JS)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_setMemShort + (JNIEnv * jniHandle, jclass jniClass, jlong address, jshort value) { + *(jshort*)address = value; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: setMemChar + * Signature: (JC)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_setMemChar + (JNIEnv * jniHandle, jclass jniClass, jlong address, jchar value) { + *(jchar*)address = value; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: setMemInt + * Signature: (JI)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_setMemInt + (JNIEnv * jniHandle, jclass jniClass, jlong address, jint value) { + *(jint*)address = value; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: setMemLong + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_setMemLong + (JNIEnv * jniHandle, jclass jniClass, jlong address, jlong value) { + *(jlong*)address = value; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: setMemDouble + * Signature: (JD)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_setMemDouble + (JNIEnv * jniHandle, jclass jniClass, jlong address, jdouble value) { + *(jdouble*)address = value; +} + +/* + * Class: net_lax1dude_unsafememcpy_UnsafeUtils + * Method: setMemFloat + * Signature: (JF)V + */ +JNIEXPORT void JNICALL Java_net_lax1dude_unsafememcpy_UnsafeUtils_setMemFloat + (JNIEnv * jniHandle, jclass jniClass, jlong address, jfloat value) { + *(jfloat*)address = value; +} diff --git a/native/utils.c b/native/utils.c new file mode 100644 index 0000000..eaeccb2 --- /dev/null +++ b/native/utils.c @@ -0,0 +1,43 @@ +/* + * 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 "utils.h" + +void unsafeThrowNotDirectBuffer(JNIEnv* jniHandle) { + jclass exceptionClass = (*jniHandle)->FindClass(jniHandle, "java/lang/IllegalArgumentException"); + if (!exceptionClass) { + return; // should not happen ever + } + (*jniHandle)->ThrowNew(jniHandle, exceptionClass, "NIO Buffer object is not direct!"); +} + +void unsafeThrowOutOfMemory(JNIEnv* jniHandle) { + jclass exceptionClass = (*jniHandle)->FindClass(jniHandle, "java/lang/OutOfMemoryError"); + if (!exceptionClass) { + return; + } + (*jniHandle)->ThrowNew(jniHandle, exceptionClass, "Not enough memory available to access the array!"); +} diff --git a/native/utils.h b/native/utils.h new file mode 100644 index 0000000..bc2391d --- /dev/null +++ b/native/utils.h @@ -0,0 +1,35 @@ +/* + * 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 + +#define NATIVE_LIBRARY_VERSION_MAJOR 1 +#define NATIVE_LIBRARY_VERSION_MINOR 0 + +void unsafeThrowNotDirectBuffer(JNIEnv* jniHandle); +void unsafeThrowOutOfMemory(JNIEnv* jniHandle);