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 }