001/*
002 * BridJ - Dynamic and blazing-fast native interop for Java.
003 * http://bridj.googlecode.com/
004 *
005 * Copyright (c) 2010-2013, Olivier Chafik (http://ochafik.com/)
006 * All rights reserved.
007 *
008 * Redistribution and use in source and binary forms, with or without
009 * modification, are permitted provided that the following conditions are met:
010 * 
011 *     * Redistributions of source code must retain the above copyright
012 *       notice, this list of conditions and the following disclaimer.
013 *     * Redistributions in binary form must reproduce the above copyright
014 *       notice, this list of conditions and the following disclaimer in the
015 *       documentation and/or other materials provided with the distribution.
016 *     * Neither the name of Olivier Chafik nor the
017 *       names of its contributors may be used to endorse or promote products
018 *       derived from this software without specific prior written permission.
019 * 
020 * THIS SOFTWARE IS PROVIDED BY OLIVIER CHAFIK AND CONTRIBUTORS ``AS IS'' AND ANY
021 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
022 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
023 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
024 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
025 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
026 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
027 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
028 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
029 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
030 */
031package org.bridj;
032
033import java.io.*;
034
035import java.lang.reflect.Method;
036import java.lang.reflect.Modifier;
037import java.nio.Buffer;
038import static org.bridj.dyncall.DyncallLibrary.*;
039import static org.bridj.Pointer.*;
040import java.nio.ByteBuffer;
041import java.util.List;
042import static org.bridj.Platform.*;
043import org.bridj.objc.*;
044
045/**
046 * Low-level calls to JNI and to BridJ's native library.
047 * @author ochafik
048 * @deprecated These methods can cause serious issues (segmentation fault, system crashes) if used without care : there are little to no checks performed on the arguments.
049 */
050@Deprecated
051public class JNI {
052        static {
053                Platform.initLibrary();
054        }
055    @Deprecated
056    public static native long getEnv();
057    @Deprecated
058    public static native long getJVM();
059    @Deprecated
060    public static native Object refToObject(long refPeer);
061    
062    static native long loadLibrary(String path);
063    static native void freeLibrary(long libHandle);
064    static native long loadLibrarySymbols(String libPath);
065    static native void freeLibrarySymbols(long symbolsHandle);
066    static native long findSymbolInLibrary(long libHandle, String name);
067    static native String[] getLibrarySymbols(long libHandle, long symbolsHandle);
068    static native String findSymbolName(long libHandle, long symbolsHandle, long address);
069
070    /**
071     * Create a JNI global reference to a Java object : long value that can be safely passed to C programs and stored, which prevent the object from being garbage-collected and which validity runs until {@link JNI#deleteGlobalRef(long)} is called
072     */
073        public static native long newGlobalRef(Object object);
074        /**
075     * Delete a global reference created by {@link JNI#newGlobalRef(java.lang.Object)}
076     */
077        public static native void deleteGlobalRef(long reference);
078    
079        public static Pointer<?> getGlobalPointer(Object object) {
080                return pointerToAddress(newGlobalRef(object), new Pointer.Releaser() {
081                        public void release(Pointer<?> p) {
082                                deleteGlobalRef(p.getPeer());
083                        }
084                });
085        }
086        
087        /**
088     * Create a JNI weak global reference to a Java object : long value that can be safely passed to C programs and stored, which validity runs until {@link JNI#deleteWeakGlobalRef(long)} is called.<br>
089     * Unlike global references, weak global references don't prevent objects from being garbage-collected.
090     */
091        public static native long newWeakGlobalRef(Object object);
092        /**
093     * Delete a weak global reference created by {@link JNI#newWeakGlobalRef(java.lang.Object)}
094     */
095        public static native void deleteWeakGlobalRef(long reference);
096
097    /**
098     * Wrap a native address as a direct byte buffer of the specified byte capacity.<br>
099     * Memory is not reclaimed when the buffer is garbage-collected.
100     */
101    public static native ByteBuffer newDirectByteBuffer(long address, long capacity);
102    /**
103     * Get the native address pointed to by a direct buffer.
104     */
105    public static native long getDirectBufferAddress(Buffer b);
106    /**
107     * Get the capacity in bytes of a direct buffer.
108     */
109    public static native long getDirectBufferCapacity(Buffer b);
110
111
112    @Deprecated
113    static native long getIntArrayElements(int[] array, boolean[] pIsCopy);
114    @Deprecated
115    static native void releaseIntArrayElements(int[] array, long pointer, int mode);
116
117    @Deprecated
118    static native int get_int(long peer);
119    @Deprecated
120    static native void set_int(long peer, int value);
121    @Deprecated
122    static native int[] get_int_array(long peer, int length);
123    @Deprecated
124    static native void set_int_array(long peer, int[] values, int valuesOffset, int length);
125
126                @Deprecated
127    static native int get_int_disordered(long peer);
128        @Deprecated
129    static native void set_int_disordered(long peer, int value);
130    @Deprecated
131    static native int[] get_int_array_disordered(long peer, int length);
132        @Deprecated
133    static native void set_int_array_disordered(long peer, int[] values, int valuesOffset, int length);
134        
135    @Deprecated
136    static native long getLongArrayElements(long[] array, boolean[] pIsCopy);
137    @Deprecated
138    static native void releaseLongArrayElements(long[] array, long pointer, int mode);
139
140    @Deprecated
141    static native long get_long(long peer);
142    @Deprecated
143    static native void set_long(long peer, long value);
144    @Deprecated
145    static native long[] get_long_array(long peer, int length);
146    @Deprecated
147    static native void set_long_array(long peer, long[] values, int valuesOffset, int length);
148
149                @Deprecated
150    static native long get_long_disordered(long peer);
151        @Deprecated
152    static native void set_long_disordered(long peer, long value);
153    @Deprecated
154    static native long[] get_long_array_disordered(long peer, int length);
155        @Deprecated
156    static native void set_long_array_disordered(long peer, long[] values, int valuesOffset, int length);
157        
158    @Deprecated
159    static native long getShortArrayElements(short[] array, boolean[] pIsCopy);
160    @Deprecated
161    static native void releaseShortArrayElements(short[] array, long pointer, int mode);
162
163    @Deprecated
164    static native short get_short(long peer);
165    @Deprecated
166    static native void set_short(long peer, short value);
167    @Deprecated
168    static native short[] get_short_array(long peer, int length);
169    @Deprecated
170    static native void set_short_array(long peer, short[] values, int valuesOffset, int length);
171
172                @Deprecated
173    static native short get_short_disordered(long peer);
174        @Deprecated
175    static native void set_short_disordered(long peer, short value);
176    @Deprecated
177    static native short[] get_short_array_disordered(long peer, int length);
178        @Deprecated
179    static native void set_short_array_disordered(long peer, short[] values, int valuesOffset, int length);
180        
181    @Deprecated
182    static native long getByteArrayElements(byte[] array, boolean[] pIsCopy);
183    @Deprecated
184    static native void releaseByteArrayElements(byte[] array, long pointer, int mode);
185
186    @Deprecated
187    static native byte get_byte(long peer);
188    @Deprecated
189    static native void set_byte(long peer, byte value);
190    @Deprecated
191    static native byte[] get_byte_array(long peer, int length);
192    @Deprecated
193    static native void set_byte_array(long peer, byte[] values, int valuesOffset, int length);
194
195        
196    @Deprecated
197    static native long getCharArrayElements(char[] array, boolean[] pIsCopy);
198    @Deprecated
199    static native void releaseCharArrayElements(char[] array, long pointer, int mode);
200
201    @Deprecated
202    static native char get_char(long peer);
203    @Deprecated
204    static native void set_char(long peer, char value);
205    @Deprecated
206    static native char[] get_char_array(long peer, int length);
207    @Deprecated
208    static native void set_char_array(long peer, char[] values, int valuesOffset, int length);
209
210                @Deprecated
211    static native char get_char_disordered(long peer);
212        @Deprecated
213    static native void set_char_disordered(long peer, char value);
214    @Deprecated
215    static native char[] get_char_array_disordered(long peer, int length);
216        @Deprecated
217    static native void set_char_array_disordered(long peer, char[] values, int valuesOffset, int length);
218        
219    @Deprecated
220    static native long getFloatArrayElements(float[] array, boolean[] pIsCopy);
221    @Deprecated
222    static native void releaseFloatArrayElements(float[] array, long pointer, int mode);
223
224    @Deprecated
225    static native float get_float(long peer);
226    @Deprecated
227    static native void set_float(long peer, float value);
228    @Deprecated
229    static native float[] get_float_array(long peer, int length);
230    @Deprecated
231    static native void set_float_array(long peer, float[] values, int valuesOffset, int length);
232
233                @Deprecated
234    static native float get_float_disordered(long peer);
235        @Deprecated
236    static native void set_float_disordered(long peer, float value);
237    @Deprecated
238    static native float[] get_float_array_disordered(long peer, int length);
239        @Deprecated
240    static native void set_float_array_disordered(long peer, float[] values, int valuesOffset, int length);
241        
242    @Deprecated
243    static native long getDoubleArrayElements(double[] array, boolean[] pIsCopy);
244    @Deprecated
245    static native void releaseDoubleArrayElements(double[] array, long pointer, int mode);
246
247    @Deprecated
248    static native double get_double(long peer);
249    @Deprecated
250    static native void set_double(long peer, double value);
251    @Deprecated
252    static native double[] get_double_array(long peer, int length);
253    @Deprecated
254    static native void set_double_array(long peer, double[] values, int valuesOffset, int length);
255
256                @Deprecated
257    static native double get_double_disordered(long peer);
258        @Deprecated
259    static native void set_double_disordered(long peer, double value);
260    @Deprecated
261    static native double[] get_double_array_disordered(long peer, int length);
262        @Deprecated
263    static native void set_double_array_disordered(long peer, double[] values, int valuesOffset, int length);
264        
265    @Deprecated
266    static native long getBooleanArrayElements(boolean[] array, boolean[] pIsCopy);
267    @Deprecated
268    static native void releaseBooleanArrayElements(boolean[] array, long pointer, int mode);
269
270    @Deprecated
271    static native boolean get_boolean(long peer);
272    @Deprecated
273    static native void set_boolean(long peer, boolean value);
274    @Deprecated
275    static native boolean[] get_boolean_array(long peer, int length);
276    @Deprecated
277    static native void set_boolean_array(long peer, boolean[] values, int valuesOffset, int length);
278
279        
280        public static native void callSinglePointerArgVoidFunction(long functionPointer, long pointerArg, int callMode);
281        
282        static native long createCToJavaCallback(MethodCallInfo info);
283        static native long getActualCToJavaCallback(long handle);
284        
285        static native long bindJavaMethodsToObjCMethods(MethodCallInfo... infos);
286        static native long bindJavaToCCallbacks(MethodCallInfo... infos);
287        static native long bindJavaMethodsToCFunctions(MethodCallInfo... infos);
288        static native long bindJavaMethodsToVirtualMethods(MethodCallInfo... infos);
289        
290        static native void freeCToJavaCallback(long handle);
291        static native void freeObjCMethodBindings(long handle, int size);
292        static native void freeJavaToCCallbacks(long handle, int size);
293        static native void freeCFunctionBindings(long handle, int size);
294        static native void freeVirtualMethodBindings(long handle, int size);
295        
296        static native long createCallTempStruct();
297        static native void deleteCallTempStruct(long handle);
298        
299        static native long mallocNulled(long size);
300        static native long mallocNulledAligned(long size, int alignment);
301        
302        static native long malloc(long size);
303    static native void free(long pointer);
304    static native long strlen(long pointer);
305    static native long wcslen(long pointer);
306    static native void memcpy(long dest, long source, long size);
307    static native void memmove(long dest, long source, long size);
308    static native long memchr(long ptr, byte value, long num);
309    static native long memmem(long haystack, long haystackLength, long needle, long needleLength);
310    static native long memmem_last(long haystack, long haystackLength, long needle, long needleLength);
311    static native int memcmp(long ptr1, long ptr2, long num);
312    static native void memset(long ptr, byte value, long num);
313}