001    package org.bridj;
002    
003    import java.io.*;
004    
005    import java.lang.reflect.Method;
006    import java.lang.reflect.Modifier;
007    import java.nio.Buffer;
008    import static org.bridj.dyncall.DyncallLibrary.*;
009    import static org.bridj.Pointer.*;
010    import java.nio.ByteBuffer;
011    import java.util.List;
012    import static org.bridj.Platform.*;
013    import org.bridj.objc.*;
014    
015    /**
016     * Low-level calls to JNI and to BridJ's native library.
017     * @author ochafik
018     * @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.
019     */
020    @Deprecated
021    public class JNI {
022            static {
023                    Platform.initLibrary();
024            }
025        @Deprecated
026        public static native long getEnv();
027        @Deprecated
028        public static native long getJVM();
029        @Deprecated
030        public static native Object refToObject(long refPeer);
031        
032        static native long loadLibrary(String path);
033        static native void freeLibrary(long libHandle);
034        static native long loadLibrarySymbols(String libPath);
035        static native void freeLibrarySymbols(long symbolsHandle);
036        static native long findSymbolInLibrary(long libHandle, String name);
037        static native String[] getLibrarySymbols(long libHandle, long symbolsHandle);
038        static native String findSymbolName(long libHandle, long symbolsHandle, long address);
039    
040        /**
041         * 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
042         */
043            public static native long newGlobalRef(Object object);
044            /**
045         * Delete a global reference created by {@link JNI#newGlobalRef(java.lang.Object)}
046         */
047            public static native void deleteGlobalRef(long reference);
048        
049            public static Pointer<?> getGlobalPointer(Object object) {
050                    return pointerToAddress(newGlobalRef(object), new Pointer.Releaser() {
051                            public void release(Pointer<?> p) {
052                                    deleteGlobalRef(p.getPeer());
053                            }
054                    });
055            }
056            
057            /**
058         * 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>
059         * Unlike global references, weak global references don't prevent objects from being garbage-collected.
060         */
061            public static native long newWeakGlobalRef(Object object);
062            /**
063         * Delete a weak global reference created by {@link JNI#newWeakGlobalRef(java.lang.Object)}
064         */
065            public static native void deleteWeakGlobalRef(long reference);
066    
067        /**
068         * Wrap a native address as a direct byte buffer of the specified byte capacity.<br>
069         * Memory is not reclaimed when the buffer is garbage-collected.
070         */
071        public static native ByteBuffer newDirectByteBuffer(long address, long capacity);
072        /**
073         * Get the native address pointed to by a direct buffer.
074         */
075        public static native long getDirectBufferAddress(Buffer b);
076        /**
077         * Get the capacity in bytes of a direct buffer.
078         */
079        public static native long getDirectBufferCapacity(Buffer b);
080    
081    
082        @Deprecated
083        static native long getIntArrayElements(int[] array, boolean[] pIsCopy);
084        @Deprecated
085        static native void releaseIntArrayElements(int[] array, long pointer, int mode);
086    
087        @Deprecated
088        static native int get_int(long peer);
089        @Deprecated
090        static native void set_int(long peer, int value);
091        @Deprecated
092        static native int[] get_int_array(long peer, int length);
093        @Deprecated
094        static native void set_int_array(long peer, int[] values, int valuesOffset, int length);
095    
096                    @Deprecated
097        static native int get_int_disordered(long peer);
098            @Deprecated
099        static native void set_int_disordered(long peer, int value);
100        @Deprecated
101        static native int[] get_int_array_disordered(long peer, int length);
102            @Deprecated
103        static native void set_int_array_disordered(long peer, int[] values, int valuesOffset, int length);
104            
105        @Deprecated
106        static native long getLongArrayElements(long[] array, boolean[] pIsCopy);
107        @Deprecated
108        static native void releaseLongArrayElements(long[] array, long pointer, int mode);
109    
110        @Deprecated
111        static native long get_long(long peer);
112        @Deprecated
113        static native void set_long(long peer, long value);
114        @Deprecated
115        static native long[] get_long_array(long peer, int length);
116        @Deprecated
117        static native void set_long_array(long peer, long[] values, int valuesOffset, int length);
118    
119                    @Deprecated
120        static native long get_long_disordered(long peer);
121            @Deprecated
122        static native void set_long_disordered(long peer, long value);
123        @Deprecated
124        static native long[] get_long_array_disordered(long peer, int length);
125            @Deprecated
126        static native void set_long_array_disordered(long peer, long[] values, int valuesOffset, int length);
127            
128        @Deprecated
129        static native long getShortArrayElements(short[] array, boolean[] pIsCopy);
130        @Deprecated
131        static native void releaseShortArrayElements(short[] array, long pointer, int mode);
132    
133        @Deprecated
134        static native short get_short(long peer);
135        @Deprecated
136        static native void set_short(long peer, short value);
137        @Deprecated
138        static native short[] get_short_array(long peer, int length);
139        @Deprecated
140        static native void set_short_array(long peer, short[] values, int valuesOffset, int length);
141    
142                    @Deprecated
143        static native short get_short_disordered(long peer);
144            @Deprecated
145        static native void set_short_disordered(long peer, short value);
146        @Deprecated
147        static native short[] get_short_array_disordered(long peer, int length);
148            @Deprecated
149        static native void set_short_array_disordered(long peer, short[] values, int valuesOffset, int length);
150            
151        @Deprecated
152        static native long getByteArrayElements(byte[] array, boolean[] pIsCopy);
153        @Deprecated
154        static native void releaseByteArrayElements(byte[] array, long pointer, int mode);
155    
156        @Deprecated
157        static native byte get_byte(long peer);
158        @Deprecated
159        static native void set_byte(long peer, byte value);
160        @Deprecated
161        static native byte[] get_byte_array(long peer, int length);
162        @Deprecated
163        static native void set_byte_array(long peer, byte[] values, int valuesOffset, int length);
164    
165            
166        @Deprecated
167        static native long getCharArrayElements(char[] array, boolean[] pIsCopy);
168        @Deprecated
169        static native void releaseCharArrayElements(char[] array, long pointer, int mode);
170    
171        @Deprecated
172        static native char get_char(long peer);
173        @Deprecated
174        static native void set_char(long peer, char value);
175        @Deprecated
176        static native char[] get_char_array(long peer, int length);
177        @Deprecated
178        static native void set_char_array(long peer, char[] values, int valuesOffset, int length);
179    
180                    @Deprecated
181        static native char get_char_disordered(long peer);
182            @Deprecated
183        static native void set_char_disordered(long peer, char value);
184        @Deprecated
185        static native char[] get_char_array_disordered(long peer, int length);
186            @Deprecated
187        static native void set_char_array_disordered(long peer, char[] values, int valuesOffset, int length);
188            
189        @Deprecated
190        static native long getFloatArrayElements(float[] array, boolean[] pIsCopy);
191        @Deprecated
192        static native void releaseFloatArrayElements(float[] array, long pointer, int mode);
193    
194        @Deprecated
195        static native float get_float(long peer);
196        @Deprecated
197        static native void set_float(long peer, float value);
198        @Deprecated
199        static native float[] get_float_array(long peer, int length);
200        @Deprecated
201        static native void set_float_array(long peer, float[] values, int valuesOffset, int length);
202    
203                    @Deprecated
204        static native float get_float_disordered(long peer);
205            @Deprecated
206        static native void set_float_disordered(long peer, float value);
207        @Deprecated
208        static native float[] get_float_array_disordered(long peer, int length);
209            @Deprecated
210        static native void set_float_array_disordered(long peer, float[] values, int valuesOffset, int length);
211            
212        @Deprecated
213        static native long getDoubleArrayElements(double[] array, boolean[] pIsCopy);
214        @Deprecated
215        static native void releaseDoubleArrayElements(double[] array, long pointer, int mode);
216    
217        @Deprecated
218        static native double get_double(long peer);
219        @Deprecated
220        static native void set_double(long peer, double value);
221        @Deprecated
222        static native double[] get_double_array(long peer, int length);
223        @Deprecated
224        static native void set_double_array(long peer, double[] values, int valuesOffset, int length);
225    
226                    @Deprecated
227        static native double get_double_disordered(long peer);
228            @Deprecated
229        static native void set_double_disordered(long peer, double value);
230        @Deprecated
231        static native double[] get_double_array_disordered(long peer, int length);
232            @Deprecated
233        static native void set_double_array_disordered(long peer, double[] values, int valuesOffset, int length);
234            
235        @Deprecated
236        static native long getBooleanArrayElements(boolean[] array, boolean[] pIsCopy);
237        @Deprecated
238        static native void releaseBooleanArrayElements(boolean[] array, long pointer, int mode);
239    
240        @Deprecated
241        static native boolean get_boolean(long peer);
242        @Deprecated
243        static native void set_boolean(long peer, boolean value);
244        @Deprecated
245        static native boolean[] get_boolean_array(long peer, int length);
246        @Deprecated
247        static native void set_boolean_array(long peer, boolean[] values, int valuesOffset, int length);
248    
249            
250            public static native void callSinglePointerArgVoidFunction(long functionPointer, long pointerArg, int callMode);
251            
252            static native long createCToJavaCallback(MethodCallInfo info);
253            static native long getActualCToJavaCallback(long handle);
254            
255            static native long bindJavaMethodsToObjCMethods(MethodCallInfo... infos);
256            static native long bindJavaToCCallbacks(MethodCallInfo... infos);
257            static native long bindJavaMethodsToCFunctions(MethodCallInfo... infos);
258            static native long bindJavaMethodsToVirtualMethods(MethodCallInfo... infos);
259            
260            static native void freeCToJavaCallback(long handle);
261            static native void freeObjCMethodBindings(long handle, int size);
262            static native void freeJavaToCCallbacks(long handle, int size);
263            static native void freeCFunctionBindings(long handle, int size);
264            static native void freeVirtualMethodBindings(long handle, int size);
265            
266            static native long createCallTempStruct();
267            static native void deleteCallTempStruct(long handle);
268            
269            static native long mallocNulled(long size);
270            static native long mallocNulledAligned(long size, int alignment);
271            
272            static native long malloc(long size);
273        static native void free(long pointer);
274        static native long strlen(long pointer);
275        static native long wcslen(long pointer);
276        static native void memcpy(long dest, long source, long size);
277        static native void memmove(long dest, long source, long size);
278        static native long memchr(long ptr, byte value, long num);
279        static native long memmem(long haystack, long haystackLength, long needle, long needleLength);
280        static native long memmem_last(long haystack, long haystackLength, long needle, long needleLength);
281        static native int memcmp(long ptr1, long ptr2, long num);
282        static native void memset(long ptr, byte value, long num);
283    }