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}