Advertisement
Guest User

jni.pas 1.7

a guest
Jun 14th, 2012
627
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 131.88 KB | None | 0 0
  1. {******************************************************************}
  2. { }
  3. { Borland Delphi Runtime Library }
  4. { Java Native Interface Unit }
  5. { }
  6. { Portions created by Sun are }
  7. { Copyright (C) 1996-1999 Sun Microsystems, Inc., }
  8. { 901 San Antonio Road, Palo Alto, California, 94303, U.S.A. }
  9. { All Rights Reserved. }
  10. { }
  11. { The original file is: jni.h, released 22 Apr 1999. }
  12. { The original Pascal code is: jni.pas, released 01 Sep 2000. }
  13. { }
  14. { Portions created by Matthew Mead are }
  15. { Copyright (C) 2000-2002 MMG and Associates }
  16. { }
  17. { Obtained through: }
  18. { Joint Endeavour of Delphi Innovators (Project JEDI) }
  19. { }
  20. { You may retrieve the latest version of this file at the Project }
  21. { JEDI home page, located at http://delphi-jedi.org }
  22. { }
  23. { The contents of this file are used with permission, subject to }
  24. { the Mozilla Public License Version 1.1 (the "License"); you may }
  25. { not use this file except in compliance with the License. You may }
  26. { obtain a copy of the License at }
  27. { http://www.mozilla.org/NPL/NPL-1_1Final.html }
  28. { }
  29. { Software distributed under the License is distributed on an }
  30. { "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
  31. { implied. See the License for the specific language governing }
  32. { rights and limitations under the License. }
  33. { }
  34. { History: }
  35. { 03 Dec 2000 - Fixed parameters for DestroyJavaVM, GetEnv, }
  36. { AttachCurrentThread, and DetachCurrentThread }
  37. { 02 Jan 2001 - Fix in TJNIEnv.ArgsToJValues. Cast AnsiString }
  38. { to JString. }
  39. { 13 Mar 2002 - In the TJavaVM wrapper class, made the JavaVM }
  40. { and Env properties read/write. Previously, both }
  41. { were set as read-only. }
  42. { 16 Mar 2002 - Added support for J2SDK v 1.4 }
  43. { 02 Apr 2002 - Changed WIN32 directive to MSWINDOWS }
  44. { 01 Nov 2002 - Implemented the TJNIEnv.NewObject method. It had }
  45. { been left unimplemented since the first version. }
  46. { 10 Sep 2006 - Aki Nieminen: }
  47. { added JStringToWideString, WideStringToJString, }
  48. { WideCharTOJString methods,ThrowException, }
  49. { SetXXXMethod }
  50. { 07 Apr 2007 - Aki Nieminen: }
  51. { BytesToJByteArray, IntegersToJIntArray }
  52. { JNI_BytesToJByteArray, JNI_IntegersToJIntArray }
  53. { 09 Feb 2011 - Remy Lebeau: }
  54. { Corrected bad function declarations to match }
  55. { official JNI specification correctly. }
  56. { Added new methods to TJavaVM }
  57. { Tweaks to Error handling }
  58. { Added UnicodeString support }
  59. { }
  60. {******************************************************************}
  61.  
  62. unit JNI;
  63.  
  64. interface
  65.  
  66. uses
  67. {$IFDEF MSWINDOWS}
  68. Windows, Types,
  69. {$ENDIF}
  70. {$IFDEF LINUX}
  71. Types, Libc,
  72. {$ENDIF}
  73. SysUtils;
  74.  
  75. { Note:
  76. It is possible to include the defintions from JNI_MD.INC directly
  77. in this file. However, the idea behind separating platform-specific
  78. definitions is to keep this file as generic as possible. Some time
  79. ago, this would not have been important, since Delphi *was* a
  80. Windows-only tool. Now, with Kylix approaching, it will be important
  81. to keep the platform-specific types separate.
  82. }
  83.  
  84. // JNI_MD.INC contains the machine-dependent typedefs for JByte, JInt and JLong
  85.  
  86. {$INCLUDE JNI_MD.INC}
  87.  
  88. {$IFDEF LINUX}
  89. type
  90. va_list = PAnsiChar;
  91. {$ENDIF}
  92.  
  93. {$IFDEF CONDITIONALEXPRESSIONS}
  94. {$IF RTLVersion >= 20.0}
  95. {$DEFINE HAS_RAWBYTESTRING}
  96. {$DEFINE HAS_UNICODESTRING}
  97. {$IFEND}
  98. {$ENDIF}
  99.  
  100. {$IFNDEF HAS_UNICODESTRING}
  101. type
  102. RawByteString = AnsiString;
  103. {$ENDIF}
  104.  
  105. {$IFNDEF HAS_UNICODESTRING}
  106. type
  107. UnicodeString = WideString;
  108. {$ENDIF}
  109.  
  110. const
  111. JNI_VERSION_1_1 = JInt($00010001);
  112. {$EXTERNALSYM JNI_VERSION_1_1}
  113. JNI_VERSION_1_2 = JInt($00010002);
  114. {$EXTERNALSYM JNI_VERSION_1_2}
  115. JNI_VERSION_1_4 = JInt($00010004);
  116. {$EXTERNALSYM JNI_VERSION_1_4}
  117. JNI_VERSION_1_6 = JInt($00010006);
  118. {$EXTERNALSYM JNI_VERSION_1_6}
  119. JNI_VERSION_1_7 = JInt($00010007);
  120. {$EXTERNALSYM JNI_VERSION_1_7}
  121.  
  122. // JBoolean constants
  123. JNI_FALSE = 0;
  124. {$EXTERNALSYM JNI_FALSE}
  125. JNI_TRUE = 1;
  126. {$EXTERNALSYM JNI_TRUE}
  127.  
  128. // possible return values for JNI functions.
  129. JNI_OK = 0; // success
  130. {$EXTERNALSYM JNI_OK}
  131. JNI_ERR = -1; // unknown error
  132. {$EXTERNALSYM JNI_ERR}
  133. JNI_EDETACHED = -2; // thread detached from the VM
  134. {$EXTERNALSYM JNI_EDETACHED}
  135. JNI_EVERSION = -3; // JNI version error
  136. {$EXTERNALSYM JNI_EVERSION}
  137. JNI_ENOMEM = -4; // not enough memory
  138. {$EXTERNALSYM JNI_ENOMEM}
  139. JNI_EEXIST = -5; // VM already created
  140. {$EXTERNALSYM JNI_EEXIST}
  141. JNI_EINVAL = -6; // invalid arguments
  142. {$EXTERNALSYM JNI_EINVAL}
  143.  
  144. // used in ReleaseScalarArrayElements
  145. JNI_COMMIT = 1;
  146. {$EXTERNALSYM JNI_COMMIT}
  147. JNI_ABORT = 2;
  148. {$EXTERNALSYM JNI_ABORT}
  149.  
  150. type
  151. // JNI Types
  152. JBoolean = Byte;
  153. JChar = WideChar;
  154. JShort = Smallint;
  155. JFloat = Single;
  156. JDouble = Double;
  157. JSize = JInt;
  158.  
  159. _JObject = record
  160. end;
  161.  
  162. JObject = ^_JObject;
  163. JClass = JObject;
  164. JThrowable = JObject;
  165. JString = JObject;
  166. JArray = JObject;
  167. JBooleanArray = JArray;
  168. JByteArray = JArray;
  169. JCharArray = JArray;
  170. JShortArray = JArray;
  171. JIntArray = JArray;
  172. JLongArray = JArray;
  173. JFloatArray = JArray;
  174. JDoubleArray = JArray;
  175. JObjectArray = JArray;
  176.  
  177. JWeak = JObject;
  178. JRef = JObject;
  179.  
  180. JValue = packed record
  181. case Integer of
  182. 0: (z: JBoolean);
  183. 1: (b: JByte );
  184. 2: (c: JChar );
  185. 3: (s: JShort );
  186. 4: (i: JInt );
  187. 5: (j: JLong );
  188. 6: (f: JFloat );
  189. 7: (d: JDouble );
  190. 8: (l: JObject );
  191. end;
  192.  
  193. JFieldID = ^_JFieldID;
  194. _JFieldID = record
  195. end;
  196.  
  197. JMethodID = ^_JMethodID;
  198. _JMethodID = record
  199. end;
  200.  
  201. PPointer = ^Pointer;
  202. PJByte = ^JByte;
  203. PJBoolean = ^JBoolean;
  204. PJChar = ^JChar;
  205. PJShort = ^JShort;
  206. PJInt = ^JInt;
  207. PJLong = ^JLong;
  208. PJFloat = ^JFloat;
  209. PJDouble = ^JDouble;
  210. PJString = ^JString;
  211. PJSize = ^JSize;
  212. PJClass = ^JClass;
  213. PJObject = ^JObject;
  214. PJThrowable = ^JThrowable;
  215. PJArray = ^JArray;
  216. PJByteArray = ^JByteArray;
  217. PJBooleanArray = ^JBooleanArray;
  218. PJCharArray = ^JCharArray;
  219. PJShortArray = ^JShortArray;
  220. PJIntArray = ^JIntArray;
  221. PJLongArray = ^JLongArray;
  222. PJFloatArray = ^JFloatArray;
  223. PJDoubleArray = ^JDoubleArray;
  224. PJObjectArray = ^JObjectArray;
  225. PJFieldID = ^JFieldID;
  226. PJMethodID = ^JMethodID;
  227. PJValue = ^JValue;
  228. PJWeak = ^JWeak;
  229. PJRef = ^JRef;
  230.  
  231. // used in RegisterNatives to describe native method name, signature,
  232. // and function pointer.
  233. PJNINativeMethod = ^JNINativeMethod;
  234. JNINativeMethod = packed record
  235. name: PAnsiChar;
  236. signature: PAnsiChar;
  237. fnPtr: Pointer;
  238. end;
  239. {$EXTERNALSYM JNINativeMethod}
  240.  
  241. // JNI Native Method Interface.
  242. JNIEnv = ^JNINativeInterface_;
  243. {$EXTERNALSYM JNIEnv}
  244. PJNIEnv = ^JNIEnv;
  245. PPJNIEnv = ^PJNIEnv;
  246. PJNINativeInterface = ^JNINativeInterface_;
  247.  
  248. // JNI Invocation Interface.
  249. JavaVM = ^JNIInvokeInterface_;
  250. {$EXTERNALSYM JavaVM}
  251. PJavaVM = ^JavaVM;
  252. PPJavaVM = ^PJavaVM;
  253. PJNIInvokeInterface = ^JNIInvokeInterface_;
  254.  
  255. JNINativeInterface_ = packed record
  256. reserved0: Pointer;
  257. reserved1: Pointer;
  258. reserved2: Pointer;
  259. reserved3: Pointer;
  260.  
  261. GetVersion: function(Env: PJNIEnv): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  262. DefineClass: function(Env: PJNIEnv; const Name: PAnsiChar; Loader: JObject; const Buf: PJByte; Len: JSize): JClass; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  263. FindClass: function(Env: PJNIEnv; const Name: PAnsiChar): JClass; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  264.  
  265. // Reflection Support
  266. FromReflectedMethod: function(Env: PJNIEnv; Method: JObject): JMethodID; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  267. FromReflectedField: function(Env: PJNIEnv; Field: JObject): JFieldID; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  268. ToReflectedMethod: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; IsStatic: JBoolean): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  269.  
  270. GetSuperclass: function(Env: PJNIEnv; Sub: JClass): JClass; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  271. IsAssignableFrom: function(Env: PJNIEnv; Sub: JClass; Sup: JClass): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  272.  
  273. // Reflection Support
  274. ToReflectedField: function(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID; IsStatic: JBoolean): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  275.  
  276. Throw: function(Env: PJNIEnv; Obj: JThrowable): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  277. ThrowNew: function(Env: PJNIEnv; AClass: JClass; const Msg: PAnsiChar): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  278. ExceptionOccurred: function(Env: PJNIEnv): JThrowable; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  279. ExceptionDescribe: procedure(Env: PJNIEnv); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  280. ExceptionClear: procedure(Env: PJNIEnv); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  281. FatalError: procedure(Env: PJNIEnv; const Msg: PAnsiChar); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  282.  
  283. // Local Reference Management
  284. PushLocalFrame: function(Env: PJNIEnv; Capacity: JInt): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  285. PopLocalFrame: function(Env: PJNIEnv; Result: JObject): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  286.  
  287. NewGlobalRef: function(Env: PJNIEnv; LObj: JObject): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  288. DeleteGlobalRef: procedure(Env: PJNIEnv; GRef: JObject); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  289. DeleteLocalRef: procedure(Env: PJNIEnv; Obj: JObject); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  290. IsSameObject: function(Env: PJNIEnv; Obj1: JObject; Obj2: JObject): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  291.  
  292. // Local Reference Management
  293. NewLocalRef: function(Env: PJNIEnv; Ref: JObject): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  294. EnsureLocalCapacity: function(Env: PJNIEnv; Capacity: JInt): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  295.  
  296. AllocObject: function(Env: PJNIEnv; AClass: JClass): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  297. NewObject: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  298. NewObjectV: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  299. NewObjectA: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  300.  
  301. GetObjectClass: function(Env: PJNIEnv; Obj: JObject): JClass; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  302. IsInstanceOf: function(Env: PJNIEnv; Obj: JObject; AClass: JClass): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  303.  
  304. GetMethodID: function(Env: PJNIEnv; AClass: JClass; const Name: PAnsiChar; const Sig: PAnsiChar): JMethodID; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  305.  
  306. CallObjectMethod: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  307. CallObjectMethodV: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: va_list): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  308. CallObjectMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  309.  
  310. CallBooleanMethod: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  311. CallBooleanMethodV: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: va_list): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  312. CallBooleanMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  313.  
  314. CallByteMethod: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  315. CallByteMethodV: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: va_list): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  316. CallByteMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  317.  
  318. CallCharMethod: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  319. CallCharMethodV: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: va_list): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  320. CallCharMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  321.  
  322. CallShortMethod: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  323. CallShortMethodV: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: va_list): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  324. CallShortMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  325.  
  326. CallIntMethod: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  327. CallIntMethodV: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: va_list): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  328. CallIntMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  329.  
  330. CallLongMethod: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  331. CallLongMethodV: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: va_list): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  332. CallLongMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  333.  
  334. CallFloatMethod: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  335. CallFloatMethodV: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: va_list): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  336. CallFloatMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  337.  
  338. CallDoubleMethod: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  339. CallDoubleMethodV: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: va_list): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  340. CallDoubleMethodA: function(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  341.  
  342. CallVoidMethod: procedure(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  343. CallVoidMethodV: procedure(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: va_list); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  344. CallVoidMethodA: procedure(Env: PJNIEnv; Obj: JObject; MethodID: JMethodID; Args: PJValue); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  345.  
  346. CallNonvirtualObjectMethod: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  347. CallNonvirtualObjectMethodV: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  348. CallNonvirtualObjectMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  349.  
  350. CallNonvirtualBooleanMethod: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  351. CallNonvirtualBooleanMethodV: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  352. CallNonvirtualBooleanMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  353.  
  354. CallNonvirtualByteMethod: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  355. CallNonvirtualByteMethodV: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  356. CallNonvirtualByteMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  357.  
  358. CallNonvirtualCharMethod: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  359. CallNonvirtualCharMethodV: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  360. CallNonvirtualCharMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  361.  
  362. CallNonvirtualShortMethod: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  363. CallNonvirtualShortMethodV: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  364. CallNonvirtualShortMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  365.  
  366. CallNonvirtualIntMethod: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  367. CallNonvirtualIntMethodV: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  368. CallNonvirtualIntMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  369.  
  370. CallNonvirtualLongMethod: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  371. CallNonvirtualLongMethodV: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  372. CallNonvirtualLongMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  373.  
  374. CallNonvirtualFloatMethod: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  375. CallNonvirtualFloatMethodV: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  376. CallNonvirtualFloatMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  377.  
  378. CallNonvirtualDoubleMethod: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  379. CallNonvirtualDoubleMethodV: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  380. CallNonvirtualDoubleMethodA: function(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  381.  
  382. CallNonvirtualVoidMethod: procedure(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  383. CallNonvirtualVoidMethodV: procedure(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  384. CallNonvirtualVoidMethodA: procedure(Env: PJNIEnv; Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  385.  
  386. GetFieldID: function(Env: PJNIEnv; AClass: JClass; const Name: PAnsiChar; const Sig: PAnsiChar): JFieldID; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  387.  
  388. GetObjectField: function(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  389. GetBooleanField: function(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  390. GetByteField: function(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  391. GetCharField: function(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  392. GetShortField: function(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  393. GetIntField: function(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  394. GetLongField: function(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  395. GetFloatField: function(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  396. GetDoubleField: function(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  397.  
  398. SetObjectField: procedure(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID; Val: JObject); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  399. SetBooleanField: procedure(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID; Val: JBoolean); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  400. SetByteField: procedure(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID; Val: JByte); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  401. SetCharField: procedure(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID; Val: JChar); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  402. SetShortField: procedure(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID; Val: JShort); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  403. SetIntField: procedure(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID; Val: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  404. SetLongField: procedure(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID; Val: JLong); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  405. SetFloatField: procedure(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID; Val: JFloat); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  406. SetDoubleField: procedure(Env: PJNIEnv; Obj: JObject; FieldID: JFieldID; Val: JDouble); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  407.  
  408. GetStaticMethodID: function(Env: PJNIEnv; AClass: JClass; const Name: PAnsiChar; const Sig: PAnsiChar): JMethodID; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  409.  
  410. CallStaticObjectMethod: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  411. CallStaticObjectMethodV: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  412. CallStaticObjectMethodA: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  413.  
  414. CallStaticBooleanMethod: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  415. CallStaticBooleanMethodV: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  416. CallStaticBooleanMethodA: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  417.  
  418. CallStaticByteMethod: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  419. CallStaticByteMethodV: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  420. CallStaticByteMethodA: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  421.  
  422. CallStaticCharMethod: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  423. CallStaticCharMethodV: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  424. CallStaticCharMethodA: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  425.  
  426. CallStaticShortMethod: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  427. CallStaticShortMethodV: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  428. CallStaticShortMethodA: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  429.  
  430. CallStaticIntMethod: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  431. CallStaticIntMethodV: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  432. CallStaticIntMethodA: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  433.  
  434. CallStaticLongMethod: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  435. CallStaticLongMethodV: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  436. CallStaticLongMethodA: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  437.  
  438. CallStaticFloatMethod: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  439. CallStaticFloatMethodV: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  440. CallStaticFloatMethodA: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  441.  
  442. CallStaticDoubleMethod: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  443. CallStaticDoubleMethodV: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  444. CallStaticDoubleMethodA: function(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  445.  
  446. CallStaticVoidMethod: procedure(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  447. CallStaticVoidMethodV: procedure(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: va_list); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  448. CallStaticVoidMethodA: procedure(Env: PJNIEnv; AClass: JClass; MethodID: JMethodID; Args: PJValue); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  449.  
  450. GetStaticFieldID: function(Env: PJNIEnv; AClass: JClass; const Name: PAnsiChar; const Sig: PAnsiChar): JFieldID; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  451. GetStaticObjectField: function(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  452. GetStaticBooleanField: function(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  453. GetStaticByteField: function(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID): JByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  454. GetStaticCharField: function(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID): JChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  455. GetStaticShortField: function(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID): JShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  456. GetStaticIntField: function(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  457. GetStaticLongField: function(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  458. GetStaticFloatField: function(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID): JFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  459. GetStaticDoubleField: function(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID): JDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  460.  
  461. SetStaticObjectField: procedure(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID; Val: JObject); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  462. SetStaticBooleanField: procedure(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID; Val: JBoolean); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  463. SetStaticByteField: procedure(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID; Val: JByte); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  464. SetStaticCharField: procedure(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID; Val: JChar); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  465. SetStaticShortField: procedure(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID; Val: JShort); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  466. SetStaticIntField: procedure(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID; Val: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  467. SetStaticLongField: procedure(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID; Val: JLong); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  468. SetStaticFloatField: procedure(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID; Val: JFloat); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  469. SetStaticDoubleField: procedure(Env: PJNIEnv; AClass: JClass; FieldID: JFieldID; Val: JDouble); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  470.  
  471. NewString: function(Env: PJNIEnv; const Unicode: PJChar; Len: JSize): JString; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  472. GetStringLength: function(Env: PJNIEnv; Str: JString): JSize; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  473. GetStringChars: function(Env: PJNIEnv; Str: JString; IsCopy: PJBoolean): PJChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  474. ReleaseStringChars: procedure(Env: PJNIEnv; Str: JString; const Chars: PJChar); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  475.  
  476. NewStringUTF: function(Env: PJNIEnv; const UTF: PAnsiChar): JString; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  477. GetStringUTFLength: function(Env: PJNIEnv; Str: JString): JSize; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  478. GetStringUTFChars: function(Env: PJNIEnv; Str: JString; IsCopy: PJBoolean): PAnsiChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  479. ReleaseStringUTFChars: procedure(Env: PJNIEnv; Str: JString; const Chars: PAnsiChar); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  480.  
  481. GetArrayLength: function(Env: PJNIEnv; AArray: JArray): JSize; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  482.  
  483. NewObjectArray: function(Env: PJNIEnv; Len: JSize; AClass: JClass; Init: JObject): JObjectArray; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  484. GetObjectArrayElement: function(Env: PJNIEnv; AArray: JObjectArray; Index: JSize): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  485. SetObjectArrayElement: procedure(Env: PJNIEnv; AArray: JObjectArray; Index: JSize; Val: JObject); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  486.  
  487. NewBooleanArray: function(Env: PJNIEnv; Len: JSize): JBooleanArray; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  488. NewByteArray: function(Env: PJNIEnv; Len: JSize): JByteArray; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  489. NewCharArray: function(Env: PJNIEnv; Len: JSize): JCharArray; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  490. NewShortArray: function(Env: PJNIEnv; Len: JSize): JShortArray; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  491. NewIntArray: function(Env: PJNIEnv; Len: JSize): JIntArray; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  492. NewLongArray: function(Env: PJNIEnv; Len: JSize): JLongArray; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  493. NewFloatArray: function(Env: PJNIEnv; Len: JSize): JFloatArray; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  494. NewDoubleArray: function(Env: PJNIEnv; Len: JSize): JDoubleArray; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  495.  
  496. GetBooleanArrayElements: function(Env: PJNIEnv; AArray: JBooleanArray; IsCopy: PJBoolean): PJBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  497. GetByteArrayElements: function(Env: PJNIEnv; AArray: JByteArray; IsCopy: PJBoolean): PJByte; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  498. GetCharArrayElements: function(Env: PJNIEnv; AArray: JCharArray; IsCopy: PJBoolean): PJChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  499. GetShortArrayElements: function(Env: PJNIEnv; AArray: JShortArray; IsCopy: PJBoolean): PJShort; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  500. GetIntArrayElements: function(Env: PJNIEnv; AArray: JIntArray; IsCopy: PJBoolean): PJInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  501. GetLongArrayElements: function(Env: PJNIEnv; AArray: JLongArray; IsCopy: PJBoolean): PJLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  502. GetFloatArrayElements: function(Env: PJNIEnv; AArray: JFloatArray; IsCopy: PJBoolean): PJFloat; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  503. GetDoubleArrayElements: function(Env: PJNIEnv; AArray: JDoubleArray; IsCopy: PJBoolean): PJDouble; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  504.  
  505. ReleaseBooleanArrayElements: procedure(Env: PJNIEnv; AArray: JBooleanArray; Elems: PJBoolean; Mode: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  506. ReleaseByteArrayElements: procedure(Env: PJNIEnv; AArray: JByteArray; Elems: PJByte; Mode: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  507. ReleaseCharArrayElements: procedure(Env: PJNIEnv; AArray: JCharArray; Elems: PJChar; Mode: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  508. ReleaseShortArrayElements: procedure(Env: PJNIEnv; AArray: JShortArray; Elems: PJShort; Mode: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  509. ReleaseIntArrayElements: procedure(Env: PJNIEnv; AArray: JIntArray; Elems: PJInt; Mode: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  510. ReleaseLongArrayElements: procedure(Env: PJNIEnv; AArray: JLongArray; Elems: PJLong; Mode: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  511. ReleaseFloatArrayElements: procedure(Env: PJNIEnv; AArray: JFloatArray; Elems: PJFloat; Mode: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  512. ReleaseDoubleArrayElements: procedure(Env: PJNIEnv; AArray: JDoubleArray; Elems: PJDouble; Mode: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  513.  
  514. GetBooleanArrayRegion: procedure(Env: PJNIEnv; AArray: JBooleanArray; Start: JSize; Len: JSize; Buf: PJBoolean); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  515. GetByteArrayRegion: procedure(Env: PJNIEnv; AArray: JByteArray; Start: JSize; Len: JSize; Buf: PJByte); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  516. GetCharArrayRegion: procedure(Env: PJNIEnv; AArray: JCharArray; Start: JSize; Len: JSize; Buf: PJChar); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  517. GetShortArrayRegion: procedure(Env: PJNIEnv; AArray: JShortArray; Start: JSize; Len: JSize; Buf: PJShort); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  518. GetIntArrayRegion: procedure(Env: PJNIEnv; AArray: JIntArray; Start: JSize; Len: JSize; Buf: PJInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  519. GetLongArrayRegion: procedure(Env: PJNIEnv; AArray: JLongArray; Start: JSize; Len: JSize; Buf: PJLong); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  520. GetFloatArrayRegion: procedure(Env: PJNIEnv; AArray: JFloatArray; Start: JSize; Len: JSize; Buf: PJFloat); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  521. GetDoubleArrayRegion: procedure(Env: PJNIEnv; AArray: JDoubleArray; Start: JSize; Len: JSize; Buf: PJDouble); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  522.  
  523. SetBooleanArrayRegion: procedure(Env: PJNIEnv; AArray: JBooleanArray; Start: JSize; Len: JSize; Buf: PJBoolean); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  524. SetByteArrayRegion: procedure(Env: PJNIEnv; AArray: JByteArray; Start: JSize; Len: JSize; Buf: PJByte); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  525. SetCharArrayRegion: procedure(Env: PJNIEnv; AArray: JCharArray; Start: JSize; Len: JSize; Buf: PJChar); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  526. SetShortArrayRegion: procedure(Env: PJNIEnv; AArray: JShortArray; Start: JSize; Len: JSize; Buf: PJShort); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  527. SetIntArrayRegion: procedure(Env: PJNIEnv; AArray: JIntArray; Start: JSize; Len: JSize; Buf: PJInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  528. SetLongArrayRegion: procedure(Env: PJNIEnv; AArray: JLongArray; Start: JSize; Len: JSize; Buf: PJLong); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  529. SetFloatArrayRegion: procedure(Env: PJNIEnv; AArray: JFloatArray; Start: JSize; Len: JSize; Buf: PJFloat); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  530. SetDoubleArrayRegion: procedure(Env: PJNIEnv; AArray: JDoubleArray; Start: JSize; Len: JSize; Buf: PJDouble); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  531.  
  532. RegisterNatives: function(Env: PJNIEnv; AClass: JClass; const Methods: PJNINativeMethod; NMethods: JInt): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  533. UnregisterNatives: function(Env: PJNIEnv; AClass: JClass): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  534.  
  535. MonitorEnter: function(Env: PJNIEnv; Obj: JObject): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  536. MonitorExit: function(Env: PJNIEnv; Obj: JObject): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  537.  
  538. GetJavaVM: function(Env: PJNIEnv; VM: PPJavaVM): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  539.  
  540. // String Operations
  541. GetStringRegion: procedure(Env: PJNIEnv; Str: JString; Start: JSize; Len: JSize; Buf: PJChar); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  542. GetStringUTFRegion: procedure(Env: PJNIEnv; Str: JString; Start: JSize; Len: JSize; Buf: PAnsiChar); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  543.  
  544. // Array Operations
  545. GetPrimitiveArrayCritical: function(Env: PJNIEnv; AArray: JArray; IsCopy: PJBoolean): Pointer; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  546. ReleasePrimitiveArrayCritical: procedure(Env: PJNIEnv; AArray: JArray; CArray: Pointer; Mode: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  547.  
  548. // String Operations
  549. GetStringCritical: function(Env: PJNIEnv; Str: JString; IsCopy: PJBoolean): PJChar; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  550. ReleaseStringCritical: procedure(Env: PJNIEnv; Str: JString; CString: PJChar); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  551.  
  552. // Weak Global References
  553. NewWeakGlobalRef: function(Env: PJNIEnv; Obj: JObject): JWeak; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  554. DeleteWeakGlobalRef: procedure(Env: PJNIEnv; Ref: JWeak); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  555.  
  556. // Exceptions
  557. ExceptionCheck: function(Env: PJNIEnv): JBoolean; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  558.  
  559. // J2SDK1_4
  560. NewDirectByteBuffer: function(Env: PJNIEnv; Address: Pointer; Capacity: JLong): JObject; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  561. GetDirectBufferAddress: function(Env: PJNIEnv; Buf: JObject): Pointer; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  562. GetDirectBufferCapacity: function(Env: PJNIEnv; Buf: JObject): JLong; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  563.  
  564. end;
  565. {$EXTERNALSYM JNINativeInterface_}
  566.  
  567. // Invocation API
  568.  
  569. PJavaVMOption = ^JavaVMOption;
  570. JavaVMOption = packed record
  571. optionString: PAnsiChar;
  572. extraInfo: Pointer;
  573. end;
  574. {$EXTERNALSYM JavaVMOption}
  575.  
  576. PJavaVMInitArgs = ^JavaVMInitArgs;
  577. JavaVMInitArgs = packed record
  578. version: JInt;
  579. nOptions: JInt;
  580. options: PJavaVMOption;
  581. ignoreUnrecognized: JBoolean;
  582. end;
  583. {$EXTERNALSYM JavaVMInitArgs}
  584.  
  585. PJavaVMAttachArgs = ^JavaVMAttachArgs;
  586. JavaVMAttachArgs = packed record
  587. version: JInt;
  588. name: PAnsiChar;
  589. group: JObject;
  590. end;
  591. {$EXTERNALSYM JavaVMAttachArgs}
  592.  
  593. {$IFDEF MSWINDOWS}
  594. TIOFile = Pointer; // (rom) for Kylix compatibility
  595. {$ENDIF}
  596.  
  597. // These structures will be VM-specific.
  598. PJDK1_1InitArgs = ^JDK1_1InitArgs;
  599. JDK1_1InitArgs = packed record
  600. version: JInt;
  601. properties: ^PAnsiChar;
  602. checkSource: JInt;
  603. nativeStackSize: JInt;
  604. javaStackSize: JInt;
  605. minHeapSize: JInt;
  606. maxHeapSize: JInt;
  607. verifyMode: JInt;
  608. classpath: PAnsiChar;
  609.  
  610. vfprintf: function(FP: TIOFile; const Format: PAnsiChar; Args: va_list): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  611. exit: procedure(Code: JInt); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  612. abort: procedure; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  613.  
  614. enableClassGC: JInt;
  615. enableVerboseGC: JInt;
  616. disableAsyncGC: JInt;
  617. verbose: JInt;
  618. debugging: JBoolean;
  619. debugPort: JInt;
  620. end;
  621. {$EXTERNALSYM JDK1_1InitArgs}
  622.  
  623. JDK1_1AttachArgs = packed record
  624. __padding: Pointer;
  625. end;
  626. {$EXTERNALSYM JDK1_1AttachArgs}
  627.  
  628. // End VM-specific.
  629.  
  630. JNIInvokeInterface_ = packed record
  631. reserved0: Pointer;
  632. reserved1: Pointer;
  633. reserved2: Pointer;
  634.  
  635. DestroyJavaVM: function(PVM: PJavaVM): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  636. AttachCurrentThread: function(PVM: PJavaVM; PEnv: PPJNIEnv; Args: Pointer): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  637. DetachCurrentThread: function(PVM: PJavaVM): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  638.  
  639. GetEnv: function(PVM: PJavaVM; PEnv: PPJNIEnv; Version: JInt): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  640.  
  641. // J2SDK1_4
  642. AttachCurrentThreadAsDaemon: function(PVM: PJavaVM; PEnv: PPJNIEnv; Args: PJavaVMAttachArgs): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  643.  
  644. end;
  645. {$EXTERNALSYM JNIInvokeInterface_}
  646.  
  647. // Defined by native libraries.
  648. TJNI_OnLoad = function(PVM: PJavaVM; Reserved: Pointer): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  649. TJNI_OnUnload = procedure(PVM: PJavaVM; Reserved: Pointer); {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  650.  
  651. {$IFDEF DYNAMIC_LINKING}
  652. function JNI_GetDefaultJavaVMInitArgs(Args: PJDK1_1InitArgs; const JVMDLLFile: string): JInt;
  653. {$EXTERNALSYM JNI_GetDefaultJavaVMInitArgs}
  654. function JNI_CreateJavaVM(PJVM: PPJavaVM; PEnv: PPJNIEnv; Args: Pointer; const JVMDLLFile: string): JInt;
  655. {$EXTERNALSYM JNI_CreateJavaVM}
  656. function JNI_GetCreatedJavaVMs(PJVM: PPJavaVM; JSize1: JSize; JSize2: PJSize; const JVMDLLFile: string): JInt;
  657. {$EXTERNALSYM JNI_GetCreatedJavaVMs}
  658. {$ELSE}
  659. function JNI_GetDefaultJavaVMInitArgs(Args: PJDK1_1InitArgs): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  660. {$EXTERNALSYM JNI_GetDefaultJavaVMInitArgs}
  661. function JNI_CreateJavaVM(PJVM: PPJavaVM; PEnv: PPJNIEnv; Args: Pointer): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  662. {$EXTERNALSYM JNI_CreateJavaVM}
  663. function JNI_GetCreatedJavaVMs(PJVM: PPJavaVM; JSize1: JSize; JSize2: PJSize): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  664. {$EXTERNALSYM JNI_GetCreatedJavaVMs}
  665. {$ENDIF}
  666.  
  667. // Wrapper stuff
  668. type
  669. TJValueArray = array of JValue;
  670.  
  671. EJVMError = class(Exception);
  672. EJNIError = class(Exception);
  673. EJNIUnsupportedMethodError = class(EJNIError);
  674.  
  675. TJNI_GetDefaultJavaVMInitArgs = function(Args: PJDK1_1InitArgs): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  676. TJNI_CreateJavaVM = function(PJVM: PPJavaVM; PEnv: PPJNIEnv; Args: Pointer): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  677. TJNI_GetCreatedJavaVMs = function(PJVM: PPJavaVM; JSize1: JSize; JSize2: PJSize): JInt; {$IFDEF MSWINDOWS} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
  678.  
  679. TJavaVM = class(TObject)
  680. private
  681. FJavaVM: PJavaVM;
  682. FEnv: PJNIEnv;
  683. FJavaVMInitArgs: JavaVMInitArgs;
  684. FJDK1_1InitArgs: JDK1_1InitArgs;
  685. FJVMDLLFile: string;
  686.  
  687. FMajorVersion: JInt;
  688. FMinorVersion: JInt;
  689. FVersion: JInt;
  690. {$IFDEF MSWINDOWS}
  691. FDLLHandle: THandle;
  692. {$ENDIF}
  693. {$IFDEF LINUX}
  694. FDLLHandle: Pointer;
  695. {$ENDIF}
  696. FIsInitialized: Boolean;
  697.  
  698. // DLL functions
  699. FJNI_GetDefaultJavaVMInitArgs: TJNI_GetDefaultJavaVMInitArgs;
  700. FJNI_CreateJavaVM: TJNI_CreateJavaVM;
  701. FJNI_GetCreatedJavaVMs: TJNI_GetCreatedJavaVMs;
  702.  
  703. function GetMajorVersion: JInt;
  704. function GetMinorVersion: JInt;
  705. procedure SetVersion(const Value: JInt);
  706. procedure VersionCheck(const FuncName: string; RequiredVersion: JInt);
  707. public
  708. property JavaVM: PJavaVM read FJavaVM write FJavaVM;
  709. property Env: PJNIEnv read FEnv write FEnv;
  710. property JDK1_1InitArgs: JDK1_1InitArgs read FJDK1_1InitArgs;
  711. property JDK1_2InitArgs: JavaVMInitArgs read FJavaVMInitArgs;
  712. property MajorVersion: JInt read FMajorVersion;
  713. property MinorVersion: JInt read FMinorVersion;
  714. property Version: JInt read FVersion write SetVersion;
  715.  
  716. // Constructors
  717. constructor Create; overload;
  718. constructor Create(JDKVersion: Integer); overload;
  719. constructor Create(JDKVersion: Integer; const JVMDLLFilename: string); overload;
  720.  
  721. destructor Destroy; override;
  722. function LoadVM(const Options: JDK1_1InitArgs): JInt; overload;
  723. function LoadVM(const Options: JavaVMInitArgs): JInt; overload;
  724. function GetDefaultJavaVMInitArgs(var Args: JDK1_1InitArgs): JInt;
  725. function GetCreatedJavaVMs(PJVM: PPJavaVM; JSize1: JSize; var JSize2: JSize): JInt;
  726.  
  727. function DestroyJavaVM: JInt;
  728. function AttachCurrentThread(Args: PJavaVMAttachArgs): JInt;
  729. function DetachCurrentThread: JInt;
  730. function GetEnv(Version: JInt): JInt;
  731. function AttachCurrentThreadAsDaemon(Args: PJavaVMAttachArgs): JInt;
  732. end;
  733.  
  734. TJNIEnv = class(TObject)
  735. private
  736. FEnv: PJNIEnv;
  737. FMajorVersion: JInt;
  738. FMinorVersion: JInt;
  739. FVersion: JInt;
  740. FConvertedArgs: TJValueArray;
  741. function GetMajorVersion: JInt;
  742. function GetMinorVersion: JInt;
  743. procedure VersionCheck(const FuncName: string; RequiredVersion: JInt);
  744. public
  745. // Properties
  746. property Env: PJNIEnv read FEnv;
  747. property MajorVersion: JInt read FMajorVersion;
  748. property MinorVersion: JInt read FMinorVersion;
  749. property Version: JInt read FVersion;
  750.  
  751. // Constructors
  752. constructor Create(AEnv: PJNIEnv);
  753.  
  754. // Support methods
  755. //*
  756. function ArgsToJValues(const Args: array of const): PJValue;
  757. function JStringToString(JStr: JString): UTF8String;
  758. function StringToJString(const AString: UTF8String): JString;
  759. function UnicodeJStringToString(JStr: JString): RawByteString;
  760. function StringToUnicodeJString(const AString: RawByteString): JString;
  761.  
  762. // Added By Aki Nieminen
  763. function JStringToWideString(JStr: JString): UnicodeString;
  764. function WideStringToJString(Const WStr: UnicodeString): JString;
  765. function WideCharToJString(const WStr: PWideChar): JString;
  766. function BytesToJByteArray(bytes: TByteDynArray): JByteArray;
  767. function IntegersToJIntArray(arr: TIntegerDynArray): JIntArray;
  768. procedure ThrowException(E: Exception);
  769. function SetStringMethod(jc: JClass; jco: JObject; name: UTF8String; value: UnicodeString): boolean;
  770. function SetIntMethod(jc: JClass; jco: JObject; name: UTF8String; value: Integer): boolean;
  771.  
  772. // JNIEnv methods
  773. function GetVersion: JInt;
  774. function DefineClass(const Name: UTF8String; Loader: JObject; const Buf: PJByte; Len: JSize): JClass;
  775. function FindClass(const Name: UTF8String): JClass;
  776.  
  777. // Reflection Support
  778. function FromReflectedMethod(Method: JObject): JMethodID;
  779. function FromReflectedField(Field: JObject): JFieldID;
  780. function ToReflectedMethod(AClass: JClass; MethodID: JMethodID; IsStatic: JBoolean): JObject;
  781.  
  782. function GetSuperclass(Sub: JClass): JClass;
  783. function IsAssignableFrom(Sub: JClass; Sup: JClass): JBoolean;
  784.  
  785. // Reflection Support
  786. function ToReflectedField(AClass: JClass; FieldID: JFieldID; IsStatic: JBoolean): JObject;
  787.  
  788. function Throw(Obj: JThrowable): JInt;
  789. function ThrowNew(AClass: JClass; const Msg: UTF8String): JInt;
  790. function ExceptionOccurred: JThrowable;
  791. procedure ExceptionDescribe;
  792. procedure ExceptionClear;
  793. procedure FatalError(const Msg: UTF8String);
  794.  
  795. // Local Reference Management
  796. function PushLocalFrame(Capacity: JInt): JInt;
  797. function PopLocalFrame(AResult: JObject): JObject;
  798.  
  799. function NewGlobalRef(LObj: JObject): JObject;
  800. procedure DeleteGlobalRef(GRef: JObject);
  801. procedure DeleteLocalRef(Obj: JObject);
  802. function IsSameObject(Obj1: JObject; Obj2: JObject): JBoolean;
  803.  
  804. // Local Reference Management
  805. function NewLocalRef(Ref: JObject): JObject;
  806. function EnsureLocalCapacity(Capacity: JInt): JInt;
  807.  
  808. function AllocObject(AClass: JClass): JObject;
  809. function NewObject(AClass: JClass; MethodID: JMethodID; const Args: array of const): JObject;
  810. function NewObjectV(AClass: JClass; MethodID: JMethodID; Args: va_list): JObject;
  811. function NewObjectA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JObject;
  812.  
  813. function GetObjectClass(Obj: JObject): JClass;
  814. function IsInstanceOf(Obj: JObject; AClass: JClass): JBoolean;
  815.  
  816. function GetMethodID(AClass: JClass; const Name: UTF8String; const Sig: UTF8String): JMethodID;
  817.  
  818. function CallObjectMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JObject;
  819. function CallObjectMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JObject;
  820. function CallObjectMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JObject;
  821.  
  822. function CallBooleanMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JBoolean;
  823. function CallBooleanMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JBoolean;
  824. function CallBooleanMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JBoolean;
  825.  
  826. function CallByteMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JByte;
  827. function CallByteMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JByte;
  828. function CallByteMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JByte;
  829.  
  830. function CallCharMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JChar;
  831. function CallCharMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JChar;
  832. function CallCharMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JChar;
  833.  
  834. function CallShortMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JShort;
  835. function CallShortMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JShort;
  836. function CallShortMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JShort;
  837.  
  838. function CallIntMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JInt;
  839. function CallIntMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JInt;
  840. function CallIntMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JInt;
  841.  
  842. function CallLongMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JLong;
  843. function CallLongMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JLong;
  844. function CallLongMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JLong;
  845.  
  846. function CallFloatMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JFloat;
  847. function CallFloatMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JFloat;
  848. function CallFloatMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JFloat;
  849.  
  850. function CallDoubleMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JDouble;
  851. function CallDoubleMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JDouble;
  852. function CallDoubleMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JDouble;
  853.  
  854. procedure CallVoidMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const);
  855. procedure CallVoidMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list);
  856. procedure CallVoidMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue);
  857.  
  858. function CallNonvirtualObjectMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JObject;
  859. function CallNonvirtualObjectMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JObject;
  860. function CallNonvirtualObjectMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JObject;
  861.  
  862. function CallNonvirtualBooleanMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JBoolean;
  863. function CallNonvirtualBooleanMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JBoolean;
  864. function CallNonvirtualBooleanMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JBoolean;
  865.  
  866. function CallNonvirtualByteMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JByte;
  867. function CallNonvirtualByteMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JByte;
  868. function CallNonvirtualByteMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JByte;
  869.  
  870. function CallNonvirtualCharMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JChar;
  871. function CallNonvirtualCharMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JChar;
  872. function CallNonvirtualCharMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JChar;
  873.  
  874. function CallNonvirtualShortMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JShort;
  875. function CallNonvirtualShortMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JShort;
  876. function CallNonvirtualShortMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JShort;
  877.  
  878. function CallNonvirtualIntMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JInt;
  879. function CallNonvirtualIntMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JInt;
  880. function CallNonvirtualIntMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JInt;
  881.  
  882. function CallNonvirtualLongMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JLong;
  883. function CallNonvirtualLongMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JLong;
  884. function CallNonvirtualLongMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JLong;
  885.  
  886. function CallNonvirtualFloatMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JFloat;
  887. function CallNonvirtualFloatMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JFloat;
  888. function CallNonvirtualFloatMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JFloat;
  889.  
  890. function CallNonvirtualDoubleMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JDouble;
  891. function CallNonvirtualDoubleMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JDouble;
  892. function CallNonvirtualDoubleMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JDouble;
  893.  
  894. procedure CallNonvirtualVoidMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const);
  895. procedure CallNonvirtualVoidMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list);
  896. procedure CallNonvirtualVoidMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue);
  897.  
  898. function GetFieldID(AClass: JClass; const Name: UTF8String; const Sig: UTF8String): JFieldID;
  899.  
  900. function GetObjectField(Obj: JObject; FieldID: JFieldID): JObject;
  901. function GetBooleanField(Obj: JObject; FieldID: JFieldID): JBoolean;
  902. function GetByteField(Obj: JObject; FieldID: JFieldID): JByte;
  903. function GetCharField(Obj: JObject; FieldID: JFieldID): JChar;
  904. function GetShortField(Obj: JObject; FieldID: JFieldID): JShort;
  905. function GetIntField(Obj: JObject; FieldID: JFieldID): JInt;
  906. function GetLongField(Obj: JObject; FieldID: JFieldID): JLong;
  907. function GetFloatField(Obj: JObject; FieldID: JFieldID): JFloat;
  908. function GetDoubleField(Obj: JObject; FieldID: JFieldID): JDouble;
  909.  
  910. procedure SetObjectField(Obj: JObject; FieldID: JFieldID; Val: JObject);
  911. procedure SetBooleanField(Obj: JObject; FieldID: JFieldID; Val: JBoolean);
  912. procedure SetByteField(Obj: JObject; FieldID: JFieldID; Val: JByte);
  913. procedure SetCharField(Obj: JObject; FieldID: JFieldID; Val: JChar);
  914. procedure SetShortField(Obj: JObject; FieldID: JFieldID; Val: JShort);
  915. procedure SetIntField(Obj: JObject; FieldID: JFieldID; Val: JInt);
  916. procedure SetLongField(Obj: JObject; FieldID: JFieldID; Val: JLong);
  917. procedure SetFloatField(Obj: JObject; FieldID: JFieldID; Val: JFloat);
  918. procedure SetDoubleField(Obj: JObject; FieldID: JFieldID; Val: JDouble);
  919.  
  920. function GetStaticMethodID(AClass: JClass; const Name: UTF8String; const Sig: UTF8String): JMethodID;
  921.  
  922. function CallStaticObjectMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JObject;
  923. function CallStaticObjectMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JObject;
  924. function CallStaticObjectMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JObject;
  925.  
  926. function CallStaticBooleanMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JBoolean;
  927. function CallStaticBooleanMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JBoolean;
  928. function CallStaticBooleanMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JBoolean;
  929.  
  930. function CallStaticByteMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JByte;
  931. function CallStaticByteMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JByte;
  932. function CallStaticByteMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JByte;
  933.  
  934. function CallStaticCharMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JChar;
  935. function CallStaticCharMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JChar;
  936. function CallStaticCharMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JChar;
  937.  
  938. function CallStaticShortMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JShort;
  939. function CallStaticShortMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JShort;
  940. function CallStaticShortMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JShort;
  941.  
  942. function CallStaticIntMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JInt;
  943. function CallStaticIntMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JInt;
  944. function CallStaticIntMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JInt;
  945.  
  946. function CallStaticLongMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JLong;
  947. function CallStaticLongMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JLong;
  948. function CallStaticLongMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JLong;
  949.  
  950. function CallStaticFloatMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JFloat;
  951. function CallStaticFloatMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JFloat;
  952. function CallStaticFloatMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JFloat;
  953.  
  954. function CallStaticDoubleMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JDouble;
  955. function CallStaticDoubleMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JDouble;
  956. function CallStaticDoubleMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JDouble;
  957.  
  958. procedure CallStaticVoidMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const);
  959. procedure CallStaticVoidMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list);
  960. procedure CallStaticVoidMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue);
  961.  
  962. function GetStaticFieldID(AClass: JClass; const Name: UTF8String; const Sig: UTF8String): JFieldID;
  963. function GetStaticObjectField(AClass: JClass; FieldID: JFieldID): JObject;
  964. function GetStaticBooleanField(AClass: JClass; FieldID: JFieldID): JBoolean;
  965. function GetStaticByteField(AClass: JClass; FieldID: JFieldID): JByte;
  966. function GetStaticCharField(AClass: JClass; FieldID: JFieldID): JChar;
  967. function GetStaticShortField(AClass: JClass; FieldID: JFieldID): JShort;
  968. function GetStaticIntField(AClass: JClass; FieldID: JFieldID): JInt;
  969. function GetStaticLongField(AClass: JClass; FieldID: JFieldID): JLong;
  970. function GetStaticFloatField(AClass: JClass; FieldID: JFieldID): JFloat;
  971. function GetStaticDoubleField(AClass: JClass; FieldID: JFieldID): JDouble;
  972.  
  973. procedure SetStaticObjectField(AClass: JClass; FieldID: JFieldID; Val: JObject);
  974. procedure SetStaticBooleanField(AClass: JClass; FieldID: JFieldID; Val: JBoolean);
  975. procedure SetStaticByteField(AClass: JClass; FieldID: JFieldID; Val: JByte);
  976. procedure SetStaticCharField(AClass: JClass; FieldID: JFieldID; Val: JChar);
  977. procedure SetStaticShortField(AClass: JClass; FieldID: JFieldID; Val: JShort);
  978. procedure SetStaticIntField(AClass: JClass; FieldID: JFieldID; Val: JInt);
  979. procedure SetStaticLongField(AClass: JClass; FieldID: JFieldID; Val: JLong);
  980. procedure SetStaticFloatField(AClass: JClass; FieldID: JFieldID; Val: JFloat);
  981. procedure SetStaticDoubleField(AClass: JClass; FieldID: JFieldID; Val: JDouble);
  982.  
  983. function NewString(const Unicode: PJChar; Len: JSize): JString;
  984. function GetStringLength(Str: JString): JSize;
  985. function GetStringChars(Str: JString; var IsCopy: JBoolean): PJChar;
  986. procedure ReleaseStringChars(Str: JString; const Chars: PJChar);
  987.  
  988. function NewStringUTF(const UTF: PAnsiChar): JString;
  989. function GetStringUTFLength(Str: JString): JSize;
  990. function GetStringUTFChars(Str: JString; var IsCopy: JBoolean): PAnsiChar;
  991. procedure ReleaseStringUTFChars(Str: JString; const Chars: PAnsiChar);
  992.  
  993. function GetArrayLength(AArray: JArray): JSize;
  994.  
  995. function NewObjectArray(Len: JSize; AClass: JClass; Init: JObject): JObjectArray;
  996. function GetObjectArrayElement(AArray: JObjectArray; Index: JSize): JObject;
  997. procedure SetObjectArrayElement(AArray: JObjectArray; Index: JSize; Val: JObject);
  998.  
  999. function NewBooleanArray(Len: JSize): JBooleanArray;
  1000. function NewByteArray(Len: JSize): JByteArray;
  1001. function NewCharArray(Len: JSize): JCharArray;
  1002. function NewShortArray(Len: JSize): JShortArray;
  1003. function NewIntArray(Len: JSize): JIntArray;
  1004. function NewLongArray(Len: JSize): JLongArray;
  1005. function NewFloatArray(Len: JSize): JFloatArray;
  1006. function NewDoubleArray(Len: JSize): JDoubleArray;
  1007.  
  1008. function GetBooleanArrayElements(AArray: JBooleanArray; var IsCopy: JBoolean): PJBoolean;
  1009. function GetByteArrayElements(AArray: JByteArray; var IsCopy: JBoolean): PJByte;
  1010. function GetCharArrayElements(AArray: JCharArray; var IsCopy: JBoolean): PJChar;
  1011. function GetShortArrayElements(AArray: JShortArray; var IsCopy: JBoolean): PJShort;
  1012. function GetIntArrayElements(AArray: JIntArray; var IsCopy: JBoolean): PJInt;
  1013. function GetLongArrayElements(AArray: JLongArray; var IsCopy: JBoolean): PJLong;
  1014. function GetFloatArrayElements(AArray: JFloatArray; var IsCopy: JBoolean): PJFloat;
  1015. function GetDoubleArrayElements(AArray: JDoubleArray; var IsCopy: JBoolean): PJDouble;
  1016.  
  1017. procedure ReleaseBooleanArrayElements(AArray: JBooleanArray; Elems: PJBoolean; Mode: JInt);
  1018. procedure ReleaseByteArrayElements(AArray: JByteArray; Elems: PJByte; Mode: JInt);
  1019. procedure ReleaseCharArrayElements(AArray: JCharArray; Elems: PJChar; Mode: JInt);
  1020. procedure ReleaseShortArrayElements(AArray: JShortArray; Elems: PJShort; Mode: JInt);
  1021. procedure ReleaseIntArrayElements(AArray: JIntArray; Elems: PJInt; Mode: JInt);
  1022. procedure ReleaseLongArrayElements(AArray: JLongArray; Elems: PJLong; Mode: JInt);
  1023. procedure ReleaseFloatArrayElements(AArray: JFloatArray; Elems: PJFloat; Mode: JInt);
  1024. procedure ReleaseDoubleArrayElements(AArray: JDoubleArray; Elems: PJDouble; Mode: JInt);
  1025.  
  1026. procedure GetBooleanArrayRegion(AArray: JBooleanArray; Start: JSize; Len: JSize; Buf: PJBoolean);
  1027. procedure GetByteArrayRegion(AArray: JByteArray; Start: JSize; Len: JSize; Buf: PJByte);
  1028. procedure GetCharArrayRegion(AArray: JCharArray; Start: JSize; Len: JSize; Buf: PJChar);
  1029. procedure GetShortArrayRegion(AArray: JShortArray; Start: JSize; Len: JSize; Buf: PJShort);
  1030. procedure GetIntArrayRegion(AArray: JIntArray; Start: JSize; Len: JSize; Buf: PJInt);
  1031. procedure GetLongArrayRegion(AArray: JLongArray; Start: JSize; Len: JSize; Buf: PJLong);
  1032. procedure GetFloatArrayRegion(AArray: JFloatArray; Start: JSize; Len: JSize; Buf: PJFloat);
  1033. procedure GetDoubleArrayRegion(AArray: JDoubleArray; Start: JSize; Len: JSize; Buf: PJDouble);
  1034.  
  1035. procedure SetBooleanArrayRegion(AArray: JBooleanArray; Start: JSize; Len: JSize; Buf: PJBoolean);
  1036. procedure SetByteArrayRegion(AArray: JByteArray; Start: JSize; Len: JSize; Buf: PJByte);
  1037. procedure SetCharArrayRegion(AArray: JCharArray; Start: JSize; Len: JSize; Buf: PJChar);
  1038. procedure SetShortArrayRegion(AArray: JShortArray; Start: JSize; Len: JSize; Buf: PJShort);
  1039. procedure SetIntArrayRegion(AArray: JIntArray; Start: JSize; Len: JSize; Buf: PJInt);
  1040. procedure SetLongArrayRegion(AArray: JLongArray; Start: JSize; Len: JSize; Buf: PJLong);
  1041. procedure SetFloatArrayRegion(AArray: JFloatArray; Start: JSize; Len: JSize; Buf: PJFloat);
  1042. procedure SetDoubleArrayRegion(AArray: JDoubleArray; Start: JSize; Len: JSize; Buf: PJDouble);
  1043.  
  1044. function RegisterNatives(AClass: JClass; const Methods: PJNINativeMethod; NMethods: JInt): JInt;
  1045. function UnregisterNatives(AClass: JClass): JInt;
  1046.  
  1047. function MonitorEnter(Obj: JObject): JInt;
  1048. function MonitorExit(Obj: JObject): JInt;
  1049.  
  1050. function GetJavaVM(var VM: JavaVM): JInt;
  1051.  
  1052. // String Operations
  1053. procedure GetStringRegion(Str: JString; Start: JSize; Len: JSize; Buf: PJChar);
  1054. procedure GetStringUTFRegion(Str: JString; Start: JSize; Len: JSize; Buf: PAnsiChar);
  1055.  
  1056. // Array Operations
  1057. function GetPrimitiveArrayCritical(AArray: JArray; var IsCopy: JBoolean): Pointer;
  1058. procedure ReleasePrimitiveArrayCritical(AArray: JArray; CArray: Pointer; Mode: JInt);
  1059.  
  1060. // String Operations
  1061. function GetStringCritical(Str: JString; var IsCopy: JBoolean): PJChar;
  1062. procedure ReleaseStringCritical(Str: JString; CString: PJChar);
  1063.  
  1064. // Weak Global References
  1065. function NewWeakGlobalRef(Obj: JObject): JWeak;
  1066. procedure DeleteWeakGlobalRef(Ref: JWeak);
  1067.  
  1068. // Exceptions
  1069. function ExceptionCheck: JBoolean;
  1070.  
  1071. // J2SDK1_4
  1072. function NewDirectByteBuffer(Address: Pointer; Capacity: JLong): JObject;
  1073. function GetDirectBufferAddress(Buf: JObject): Pointer;
  1074. function GetDirectBufferCapacity(Buf: JObject): JLong;
  1075. end;
  1076.  
  1077. {$IFDEF DYNAMIC_LINKING}
  1078. procedure LoadJVM(const Filename: string);
  1079. function UnloadJVM: Boolean;
  1080. function JVMIsLoaded: Boolean;
  1081. {$ENDIF}
  1082.  
  1083.  
  1084. { ******************************************}
  1085. { static helper functions }
  1086. { ******************************************}
  1087.  
  1088. procedure JNI_ThrowException(Env: PJNIEnv; E: Exception);
  1089.  
  1090. { Convert JavaJNIString to WideString.
  1091. This is a copy of TJNIEnv.JStringToWideString function
  1092. allowing convertion without TJNIEnv instantiation.
  1093. }
  1094. function JNI_JStringToWideString(Env: PJNIEnv; JStr: JString): UnicodeString; forward;
  1095.  
  1096. { Convert WideString to JavaJNIString
  1097. This is a copy of TJNIEnv.WideStringToJString function
  1098. allowing convertion without TJNIEnv instantiation.
  1099. }
  1100. function JNI_WideStringToJString(Env: PJNIEnv; Const WStr: UnicodeString): JString; forward;
  1101. function JNI_WideCharToJString(Env: PJNIEnv; Const WStr: PWideChar): JString; forward;
  1102.  
  1103. { Convert byte array to JByteArray }
  1104. function JNI_BytesToJByteArray(Env: PJNIEnv; Bytes: TByteDynArray): JByteArray; forward;
  1105. function JNI_IntegersToJIntArray(Env: PJNIEnv; arr: TIntegerDynArray): JIntArray; forward;
  1106.  
  1107. { ******************************************}
  1108. { ******************************************}
  1109.  
  1110. implementation
  1111.  
  1112. {$IFNDEF DYNAMIC_LINKING}
  1113. const
  1114. {$IFDEF MSWINDOWS}
  1115. {$IFDEF JDK1_1}
  1116. JvmModuleName = 'javai.dll';
  1117. {$ELSE}
  1118. JvmModuleName = 'jvm.dll';
  1119. {$ENDIF}
  1120. {$ENDIF}
  1121. {$IFDEF LINUX}
  1122. JvmModuleName = 'libjvm.so';
  1123. {$ENDIF}
  1124.  
  1125. function JNI_CreateJavaVM; external JvmModuleName name 'JNI_CreateJavaVM';
  1126. function JNI_GetDefaultJavaVMInitArgs; external JvmModuleName name 'JNI_GetDefaultJavaVMInitArgs';
  1127. function JNI_GetCreatedJavaVMs; external JvmModuleName name 'JNI_GetCreatedJavaVMs';
  1128.  
  1129. {$ELSE}
  1130.  
  1131. var
  1132. {$IFDEF MSWINDOWS}
  1133. JVMHandle: THandle = 0;
  1134. {$ENDIF}
  1135. {$IFDEF LINUX}
  1136. JVMHandle: Pointer = nil;
  1137. {$ENDIF}
  1138. CreateJavaVM: TJNI_CreateJavaVM = nil;
  1139. GetCreatedJavaVMs: TJNI_GetCreatedJavaVMs = nil;
  1140. GetDefaultJavaVMInitArgs: TJNI_GetDefaultJavaVMInitArgs = nil;
  1141.  
  1142. {$IFDEF MSWINDOWS}
  1143.  
  1144. function JVMIsLoaded: Boolean;
  1145. begin
  1146. Result := JVMHandle <> 0;
  1147. end;
  1148.  
  1149. function UnloadJVM: Boolean;
  1150. begin
  1151. Result := True;
  1152. if JVMIsLoaded then
  1153. Result := FreeLibrary(JVMHandle);
  1154. JVMHandle := 0;
  1155. CreateJavaVM := nil;
  1156. GetCreatedJavaVMs := nil;
  1157. GetDefaultJavaVMInitArgs := nil;
  1158. end;
  1159.  
  1160. procedure LoadJVM(const Filename: string);
  1161. begin
  1162. if not JVMIsLoaded then
  1163. begin
  1164. JVMHandle := LoadLibrary(PChar(Filename));
  1165. if not JVMIsLoaded then
  1166. raise EJVMError.CreateFmt('LoadLibrary failed trying to load %s', [Filename]);
  1167.  
  1168. try
  1169. @CreateJavaVM := GetProcAddress(JVMHandle, 'JNI_CreateJavaVM');
  1170. if not Assigned(CreateJavaVM) then
  1171. raise EJVMError.CreateFmt('GetProcAddress failed to locate JNI_CreateJavaVM in library %s', [Filename]);
  1172.  
  1173. @GetCreatedJavaVMs := GetProcAddress(JVMHandle, 'JNI_GetCreatedJavaVMs');
  1174. if not Assigned(GetCreatedJavaVMs) then
  1175. raise EJVMError.CreateFmt('GetProcAddress failed to locate JNI_GetCreatedJavaVMs in library %s', [Filename]);
  1176.  
  1177. @GetDefaultJavaVMInitArgs := GetProcAddress(JVMHandle, 'JNI_GetDefaultJavaVMInitArgs');
  1178. if not Assigned(GetDefaultJavaVMInitArgs) then
  1179. raise EJVMError.CreateFmt('GetProcAddress failed to locate JNI_GetDefaultJavaVMInitArgs in library %s', [Filename]);
  1180. except
  1181. UnloadJVM;
  1182. raise;
  1183. end;
  1184. end;
  1185. end;
  1186.  
  1187. {$ENDIF} // MSWINDOWS
  1188.  
  1189. {$IFDEF LINUX}
  1190.  
  1191. function JVMIsLoaded: Boolean;
  1192. begin
  1193. Result := JVMHandle <> nil;
  1194. end;
  1195.  
  1196. function UnloadJVM: Boolean;
  1197. begin
  1198. Result := True;
  1199. if JVMIsLoaded then
  1200. dlclose(JVMHandle);
  1201. JVMHandle := nil;
  1202. CreateJavaVM := nil;
  1203. GetCreatedJavaVMs := nil;
  1204. GetDefaultJavaVMInitArgs := nil;
  1205. end;
  1206.  
  1207. procedure LoadJVM(const Filename: string);
  1208. begin
  1209. if not JVMIsLoaded then
  1210. begin
  1211. JVMHandle := dlopen(PChar(Filename), RTLD_NOW);
  1212. if not JVMIsLoaded then
  1213. raise EJVMError.CreateFmt('dlopen failed trying to load %s', [Filename]);
  1214.  
  1215. try
  1216. @CreateJavaVM := dlsym(JVMHandle, 'JNI_CreateJavaVM');
  1217. if not Assigned(CreateJavaVM) then
  1218. raise EJVMError.CreateFmt('dlsym failed to locate JNI_CreateJavaVM in library %s', [Filename]);
  1219.  
  1220. @GetCreatedJavaVMs := dlsym(JVMHandle, 'JNI_GetCreatedJavaVMs');
  1221. if not Assigned(GetCreatedJavaVMs) then
  1222. raise EJVMError.CreateFmt('dlsym failed to locate JNI_GetCreatedJavaVMs in library %s', [Filename]);
  1223.  
  1224. @GetDefaultJavaVMInitArgs := dlsym(JVMHandle, 'JNI_GetDefaultJavaVMInitArgs');
  1225. if not Assigned(GetDefaultJavaVMInitArgs) then
  1226. raise EJVMError.CreateFmt('dlsym failed to locate JNI_GetDefaultJavaVMInitArgs in library %s', [Filename]);
  1227. except
  1228. UnloadJVM;
  1229. raise;
  1230. end;
  1231. end;
  1232. end;
  1233.  
  1234. {$ENDIF} // LINUX
  1235.  
  1236. function JNI_CreateJavaVM(PJVM: PPJavaVM; PEnv: PPJNIEnv; Args: Pointer; const JVMDLLFile: string): JInt;
  1237. begin
  1238. LoadJVM(JVMDLLFile);
  1239. Result := CreateJavaVM(PJVM, PEnv, Args);
  1240. end;
  1241.  
  1242. function JNI_GetCreatedJavaVMs(PJVM: PPJavaVM; JSize1: JSize; JSize2: PJSize; const JVMDLLFile: string): JInt;
  1243. begin
  1244. LoadJVM(JVMDLLFile);
  1245. Result := GetCreatedJavaVMs(PJVM, JSize1, JSize2);
  1246. end;
  1247.  
  1248. function JNI_GetDefaultJavaVMInitArgs(Args: PJDK1_1InitArgs; const JVMDLLFile: string): JInt;
  1249. begin
  1250. LoadJVM(JVMDLLFile);
  1251. Result := GetDefaultJavaVMInitArgs(Args);
  1252. end;
  1253.  
  1254. {$ENDIF} // DYNAMIC_LINKING defined
  1255.  
  1256. function TJNIEnv.ArgsToJValues(const Args: array of const): PJValue;
  1257. var
  1258. I: Integer;
  1259. begin
  1260. if Length(Args) <> Length(FConvertedArgs) then
  1261. SetLength(FConvertedArgs, Length(Args));
  1262. for I := 0 to High(Args) do
  1263. case Args[I].VType of
  1264. vtInteger:
  1265. FConvertedArgs[I].i := JInt(Args[I].VInteger);
  1266. vtBoolean:
  1267. FConvertedArgs[I].z := JBoolean(Args[I].VBoolean);
  1268. vtWideChar:
  1269. FConvertedArgs[I].c := JChar(Args[I].VWideChar);
  1270. vtInt64:
  1271. FConvertedArgs[I].j := JLong(Args[I].VInt64^);
  1272. vtPointer, vtObject:
  1273. FConvertedArgs[I].l := JObject(Args[I].VObject);
  1274. vtAnsiString:
  1275. FConvertedArgs[I].l := StringToJString(UTF8String(PAnsiString(Args[I].VAnsiString)^));
  1276. vtWideString:
  1277. FConvertedArgs[I].l := WideStringToJString(PWideString(Args[I].VWideString)^);
  1278. {$IFDEF HAS_UNICODESTRING}
  1279. vtUnicodeString:
  1280. FConvertedArgs[I].l := WideStringToJString(PUnicodeString(Args[I].VUnicodeString)^);
  1281. {$ENDIF}
  1282. vtExtended:
  1283. FConvertedArgs[I].d := Args[I].VExtended^; // Extended to Double (we lose Floats here)
  1284. else
  1285. raise EJNIError.Create('Unsupported variant argument');
  1286. end;
  1287. Result := PJValue(FConvertedArgs);
  1288. end;
  1289.  
  1290. constructor TJNIEnv.Create(AEnv: PJNIEnv);
  1291. begin
  1292. inherited Create;
  1293. FConvertedArgs := nil;
  1294. FEnv := AEnv;
  1295. FMajorVersion := GetMajorVersion;
  1296. FMinorVersion := GetMinorVersion;
  1297. FVersion := GetVersion;
  1298. end;
  1299.  
  1300. { Wrap native exception to java.lang.Exception }
  1301. procedure TJNIEnv.ThrowException(E: Exception);
  1302. begin
  1303. JNI_ThrowException(FEnv, E);
  1304. end;
  1305.  
  1306. { UTF8AnsiString to JString }
  1307. function TJNIEnv.StringToJString(const AString: UTF8String): JString;
  1308. begin
  1309. Result := Env^.NewStringUTF(Env, PAnsiChar(AString));
  1310. end;
  1311.  
  1312. function TJNIEnv.StringToUnicodeJString(const AString: RawByteString): JString;
  1313. begin
  1314. Result := Env^.NewString(Env, PJChar(PAnsiChar(AString)), Length(AString) div SizeOf(WideChar));
  1315. end;
  1316.  
  1317. function TJNIEnv.JStringToString(JStr: JString): UTF8String;
  1318. var
  1319. Chars: PAnsiChar;
  1320. begin
  1321. if JStr = nil then
  1322. begin
  1323. Result := '';
  1324. Exit;
  1325. end;
  1326.  
  1327. Chars := Env^.GetStringUTFChars(Env, JStr, nil);
  1328. if Chars = nil then
  1329. Result := ''
  1330. else
  1331. begin
  1332. SetString(Result, Chars, Env^.GetStringUTFLength(Env, JStr));
  1333. Env^.ReleaseStringUTFChars(Env, JStr, Chars);
  1334. end;
  1335. end;
  1336.  
  1337. function TJNIEnv.UnicodeJStringToString(JStr: JString): RawByteString;
  1338. var
  1339. Chars: PJChar;
  1340. begin
  1341. if JStr = nil then
  1342. begin
  1343. Result := '';
  1344. Exit;
  1345. end;
  1346.  
  1347. Chars := Env^.GetStringChars(Env, JStr, nil);
  1348. if Chars = nil then
  1349. Result := ''
  1350. else
  1351. begin
  1352. SetString(Result, PAnsiChar(Chars), Env^.GetStringLength(Env, JStr) * SizeOf(WideChar));
  1353. {$IFDEF HAS_RAWBYTESTRING}
  1354. SetCodePage(Result, 1200, False);
  1355. {$ENDIF}
  1356. Env^.ReleaseStringChars(Env, JStr, Chars);
  1357. end;
  1358. end;
  1359.  
  1360. function TJNIEnv.JStringToWideString(JStr: JString): UnicodeString;
  1361. begin
  1362. // JavaJNIStr->WideString
  1363. Result := JNI_JStringToWideString(FEnv, Jstr);
  1364. //Result := UTF8Decode(JStringToString(JStr));
  1365. end;
  1366.  
  1367. function TJNIEnv.WideStringToJString(const WStr: UnicodeString): JString;
  1368. begin
  1369. Result := JNI_WideStringToJString(FEnv, WStr);
  1370. end;
  1371.  
  1372. function TJNIEnv.WideCharToJString(const WStr: PWideChar): JString;
  1373. begin
  1374. // WideString->UTF8Str->JavaJNIStr
  1375. Result := JNI_WideStringToJString(FEnv, WStr);
  1376. //Result := StringToJString(PAnsiChar(UTF8Encode(WStr)));
  1377. end;
  1378.  
  1379. { Convert byte array to JByteArray }
  1380. function TJNIEnv.BytesToJByteArray(bytes: TByteDynArray): JByteArray;
  1381. begin
  1382. Result := JNI_BytesToJByteArray(FEnv, bytes);
  1383. end;
  1384.  
  1385. { Convert integer array to JIntArray }
  1386. function TJNIEnv.IntegersToJIntArray(arr: TIntegerDynArray): JIntArray;
  1387. begin
  1388. Result := JNI_IntegersToJIntArray(FEnv, arr);
  1389. end;
  1390.  
  1391. { call "public void setName(String value)" }
  1392. function TJNIEnv.SetStringMethod(jc: JClass; jco: JObject; name: UTF8String; value: UnicodeString): boolean;
  1393. var
  1394. mId: JMethodID;
  1395. tmpObj: JObject;
  1396. begin
  1397. Result := False;
  1398. mId := self.GetMethodID(jc, PAnsiChar(name), '(Ljava/lang/String;)V');
  1399. If not Assigned(mId) then Exit;
  1400. tmpObj := self.WideStringToJString(value);
  1401. self.CallVoidMethodV(jco, mId, @tmpObj);
  1402. Result := True;
  1403. end;
  1404.  
  1405. { Call "public void setName(int value)" }
  1406. function TJNIEnv.SetIntMethod(jc: JClass; jco: JObject; name: UTF8String; value: Integer): boolean;
  1407. var
  1408. mId: JMethodID;
  1409. begin
  1410. Result := False;
  1411. mId := self.GetMethodID(jc, PAnsiChar(name), '(I)V');
  1412. If not Assigned(mId) then Exit;
  1413. self.CallVoidMethodV(jco, mId, @value);
  1414. Result := True;
  1415. end;
  1416.  
  1417.  
  1418.  
  1419. function TJNIEnv.GetMajorVersion: JInt;
  1420. begin
  1421. Result := GetVersion shr 16;
  1422. end;
  1423.  
  1424. function TJNIEnv.GetMinorVersion: JInt;
  1425. begin
  1426. Result := GetVersion mod 65536;
  1427. end;
  1428.  
  1429. function TJNIEnv.GetVersion: JInt;
  1430. begin
  1431. Result := Env^.GetVersion(Env);
  1432. end;
  1433.  
  1434. procedure TJNIEnv.VersionCheck(const FuncName: string; RequiredVersion: JInt);
  1435. begin
  1436. if Version < RequiredVersion then
  1437. raise EJNIUnsupportedMethodError.CreateFmt('Method "%s" not supported in JDK %d.%d', [FuncName, MajorVersion, MinorVersion]);
  1438. end;
  1439.  
  1440. procedure TJNIEnv.CallVoidMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const);
  1441. begin
  1442. Env^.CallVoidMethodA(Env, Obj, MethodID, ArgsToJValues(Args));
  1443. end;
  1444.  
  1445. function TJNIEnv.AllocObject(AClass: JClass): JObject;
  1446. begin
  1447. Result := Env^.AllocObject(Env, AClass);
  1448. end;
  1449.  
  1450. function TJNIEnv.CallBooleanMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JBoolean;
  1451. begin
  1452. Result := Env^.CallBooleanMethodA(Env, Obj, MethodID, ArgsToJValues(Args));
  1453. end;
  1454.  
  1455. function TJNIEnv.CallBooleanMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JBoolean;
  1456. begin
  1457. Result := Env^.CallBooleanMethodA(Env, Obj, MethodID, Args);
  1458. end;
  1459.  
  1460. function TJNIEnv.CallBooleanMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JBoolean;
  1461. begin
  1462. Result := Env^.CallBooleanMethodV(Env, Obj, MethodID, Args);
  1463. end;
  1464.  
  1465. function TJNIEnv.CallByteMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JByte;
  1466. begin
  1467. Result := Env^.CallByteMethodA(Env, Obj, MethodID, ArgsToJValues(Args));
  1468. end;
  1469.  
  1470. function TJNIEnv.CallByteMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JByte;
  1471. begin
  1472. Result := Env^.CallByteMethodA(Env, Obj, MethodID, Args);
  1473. end;
  1474.  
  1475. function TJNIEnv.CallByteMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JByte;
  1476. begin
  1477. Result := Env^.CallByteMethodV(Env, Obj, MethodID, Args);
  1478. end;
  1479.  
  1480. function TJNIEnv.CallCharMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JChar;
  1481. begin
  1482. Result := Env^.CallCharMethodA(Env, Obj, MethodID, ArgsToJValues(Args));
  1483. end;
  1484.  
  1485. function TJNIEnv.CallCharMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JChar;
  1486. begin
  1487. Result := Env^.CallCharMethodA(Env, Obj, MethodID, Args);
  1488. end;
  1489.  
  1490. function TJNIEnv.CallCharMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JChar;
  1491. begin
  1492. Result := Env^.CallCharMethodV(Env, Obj, MethodID, Args);
  1493. end;
  1494.  
  1495. function TJNIEnv.CallDoubleMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JDouble;
  1496. begin
  1497. Result := Env^.CallDoubleMethodA(Env, Obj, MethodID, ArgsToJValues(Args));
  1498. end;
  1499.  
  1500. function TJNIEnv.CallDoubleMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JDouble;
  1501. begin
  1502. Result := Env^.CallDoubleMethodA(Env, Obj, MethodID, Args);
  1503. end;
  1504.  
  1505. function TJNIEnv.CallDoubleMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JDouble;
  1506. begin
  1507. Result := Env^.CallDoubleMethodV(Env, Obj, MethodID, Args);
  1508. end;
  1509.  
  1510. function TJNIEnv.CallFloatMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JFloat;
  1511. begin
  1512. Result := Env^.CallFloatMethodA(Env, Obj, MethodID, ArgsToJValues(Args));
  1513. end;
  1514.  
  1515. function TJNIEnv.CallFloatMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JFloat;
  1516. begin
  1517. Result := Env^.CallFloatMethodA(Env, Obj, MethodID, Args);
  1518. end;
  1519.  
  1520. function TJNIEnv.CallFloatMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JFloat;
  1521. begin
  1522. Result := Env^.CallFloatMethodV(Env, Obj, MethodID, Args);
  1523. end;
  1524.  
  1525. function TJNIEnv.CallIntMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JInt;
  1526. begin
  1527. Result := Env^.CallIntMethodA(Env, Obj, MethodID, ArgsToJValues(Args));
  1528. end;
  1529.  
  1530. function TJNIEnv.CallIntMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JInt;
  1531. begin
  1532. Result := Env^.CallIntMethodA(Env, Obj, MethodID, Args);
  1533. end;
  1534.  
  1535. function TJNIEnv.CallIntMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JInt;
  1536. begin
  1537. Result := Env^.CallIntMethodV(Env, Obj, MethodID, Args);
  1538. end;
  1539.  
  1540. function TJNIEnv.CallLongMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JLong;
  1541. begin
  1542. Result := Env^.CallLongMethodA(Env, Obj, MethodID, ArgsToJValues(Args));
  1543. end;
  1544.  
  1545. function TJNIEnv.CallLongMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JLong;
  1546. begin
  1547. Result := Env^.CallLongMethodA(Env, Obj, MethodID, Args);
  1548. end;
  1549.  
  1550. function TJNIEnv.CallLongMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JLong;
  1551. begin
  1552. Result := Env^.CallLongMethodV(Env, Obj, MethodID, Args);
  1553. end;
  1554.  
  1555. function TJNIEnv.CallNonvirtualBooleanMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JBoolean;
  1556. begin
  1557. Result := Env^.CallNonvirtualBooleanMethodA(Env, Obj, AClass, MethodID, ArgsToJValues(Args));
  1558. end;
  1559.  
  1560. function TJNIEnv.CallNonvirtualBooleanMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JBoolean;
  1561. begin
  1562. Result := Env^.CallNonvirtualBooleanMethodA(Env, Obj, AClass, MethodID, Args);
  1563. end;
  1564.  
  1565. function TJNIEnv.CallNonvirtualBooleanMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JBoolean;
  1566. begin
  1567. Result := Env^.CallNonvirtualBooleanMethodV(Env, Obj, AClass, MethodID, Args);
  1568. end;
  1569.  
  1570. function TJNIEnv.CallNonvirtualByteMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JByte;
  1571. begin
  1572. Result := Env^.CallNonvirtualByteMethodA(Env, Obj, AClass, MethodID, ArgsToJValues(Args));
  1573. end;
  1574.  
  1575. function TJNIEnv.CallNonvirtualByteMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JByte;
  1576. begin
  1577. Result := Env^.CallNonvirtualByteMethodA(Env, Obj, AClass, MethodID, Args);
  1578. end;
  1579.  
  1580. function TJNIEnv.CallNonvirtualByteMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JByte;
  1581. begin
  1582. Result := Env^.CallNonvirtualByteMethodV(Env, Obj, AClass, MethodID, Args);
  1583. end;
  1584.  
  1585. function TJNIEnv.CallNonvirtualCharMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JChar;
  1586. begin
  1587. Result := Env^.CallNonvirtualCharMethodA(Env, Obj, AClass, MethodID, ArgsToJValues(Args));
  1588. end;
  1589.  
  1590. function TJNIEnv.CallNonvirtualCharMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JChar;
  1591. begin
  1592. Result := Env^.CallNonvirtualCharMethodA(Env, Obj, AClass, MethodID, Args);
  1593. end;
  1594.  
  1595. function TJNIEnv.CallNonvirtualCharMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JChar;
  1596. begin
  1597. Result := Env^.CallNonvirtualCharMethodV(Env, Obj, AClass, MethodID, Args);
  1598. end;
  1599.  
  1600. function TJNIEnv.CallNonvirtualDoubleMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JDouble;
  1601. begin
  1602. Result := Env^.CallNonvirtualDoubleMethodA(Env, Obj, AClass, MethodID, ArgsToJValues(Args));
  1603. end;
  1604.  
  1605. function TJNIEnv.CallNonvirtualDoubleMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JDouble;
  1606. begin
  1607. Result := Env^.CallNonvirtualDoubleMethodA(Env, Obj, AClass, MethodID, Args);
  1608. end;
  1609.  
  1610. function TJNIEnv.CallNonvirtualDoubleMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JDouble;
  1611. begin
  1612. Result := Env^.CallNonvirtualDoubleMethodV(Env, Obj, AClass, MethodID, Args);
  1613. end;
  1614.  
  1615. function TJNIEnv.CallNonvirtualFloatMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JFloat;
  1616. begin
  1617. Result := Env^.CallNonvirtualFloatMethodA(Env, Obj, AClass, MethodID, ArgsToJValues(Args));
  1618. end;
  1619.  
  1620. function TJNIEnv.CallNonvirtualFloatMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JFloat;
  1621. begin
  1622. Result := Env^.CallNonvirtualFloatMethodA(Env, Obj, AClass, MethodID, Args);
  1623. end;
  1624.  
  1625. function TJNIEnv.CallNonvirtualFloatMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JFloat;
  1626. begin
  1627. Result := Env^.CallNonvirtualFloatMethodV(Env, Obj, AClass, MethodID, Args);
  1628. end;
  1629.  
  1630. function TJNIEnv.CallNonvirtualIntMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JInt;
  1631. begin
  1632. Result := Env^.CallNonvirtualIntMethodA(Env, Obj, AClass, MethodID, ArgsToJValues(Args));
  1633. end;
  1634.  
  1635. function TJNIEnv.CallNonvirtualIntMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JInt;
  1636. begin
  1637. Result := Env^.CallNonvirtualIntMethodA(Env, Obj, AClass, MethodID, Args);
  1638. end;
  1639.  
  1640. function TJNIEnv.CallNonvirtualIntMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JInt;
  1641. begin
  1642. Result := Env^.CallNonvirtualIntMethodV(Env, Obj, AClass, MethodID, Args);
  1643. end;
  1644.  
  1645. function TJNIEnv.CallNonvirtualLongMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JLong;
  1646. begin
  1647. Result := Env^.CallNonvirtualLongMethodA(Env, Obj, AClass, MethodID, ArgsToJValues(Args));
  1648. end;
  1649.  
  1650. function TJNIEnv.CallNonvirtualLongMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JLong;
  1651. begin
  1652. Result := Env^.CallNonvirtualLongMethodA(Env, Obj, AClass, MethodID, Args);
  1653. end;
  1654.  
  1655. function TJNIEnv.CallNonvirtualLongMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JLong;
  1656. begin
  1657. Result := Env^.CallNonvirtualLongMethodV(Env, Obj, AClass, MethodID, Args);
  1658. end;
  1659.  
  1660. function TJNIEnv.CallNonvirtualObjectMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JObject;
  1661. begin
  1662. Result := Env^.CallNonvirtualObjectMethodA(Env, Obj, AClass, MethodID, ArgsToJValues(Args));
  1663. end;
  1664.  
  1665. function TJNIEnv.CallNonvirtualObjectMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JObject;
  1666. begin
  1667. Result := Env^.CallNonvirtualObjectMethodA(Env, Obj, AClass, MethodID, Args);
  1668. end;
  1669.  
  1670. function TJNIEnv.CallNonvirtualObjectMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JObject;
  1671. begin
  1672. Result := Env^.CallNonvirtualObjectMethodV(Env, Obj, AClass, MethodID, Args);
  1673. end;
  1674.  
  1675. function TJNIEnv.CallNonvirtualShortMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const): JShort;
  1676. begin
  1677. Result := Env^.CallNonvirtualShortMethodA(Env, Obj, AClass, MethodID, ArgsToJValues(Args));
  1678. end;
  1679.  
  1680. function TJNIEnv.CallNonvirtualShortMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue): JShort;
  1681. begin
  1682. Result := Env^.CallNonvirtualShortMethodA(Env, Obj, AClass, MethodID, Args);
  1683. end;
  1684.  
  1685. function TJNIEnv.CallNonvirtualShortMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list): JShort;
  1686. begin
  1687. Result := Env^.CallNonvirtualShortMethodV(Env, Obj, AClass, MethodID, Args);
  1688. end;
  1689.  
  1690. procedure TJNIEnv.CallNonvirtualVoidMethod(Obj: JObject; AClass: JClass; MethodID: JMethodID; const Args: array of const);
  1691. begin
  1692. Env^.CallNonvirtualVoidMethodA(Env, Obj, AClass, MethodID, ArgsToJValues(Args));
  1693. end;
  1694.  
  1695. procedure TJNIEnv.CallNonvirtualVoidMethodA(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: PJValue);
  1696. begin
  1697. Env^.CallNonvirtualDoubleMethodA(Env, Obj, AClass, MethodID, Args);
  1698. end;
  1699.  
  1700. procedure TJNIEnv.CallNonvirtualVoidMethodV(Obj: JObject; AClass: JClass; MethodID: JMethodID; Args: va_list);
  1701. begin
  1702. Env^.CallNonvirtualVoidMethodV(Env, Obj, AClass, MethodID, Args);
  1703. end;
  1704.  
  1705. function TJNIEnv.CallObjectMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JObject;
  1706. begin
  1707. Result := Env^.CallObjectMethodA(Env, Obj, MethodID, ArgsToJValues(Args));
  1708. end;
  1709.  
  1710. function TJNIEnv.CallObjectMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JObject;
  1711. begin
  1712. Result := Env^.CallObjectMethodA(Env, Obj, MethodID, Args);
  1713. end;
  1714.  
  1715. function TJNIEnv.CallObjectMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JObject;
  1716. begin
  1717. Result := Env^.CallObjectMethodV(Env, Obj, MethodID, Args);
  1718. end;
  1719.  
  1720. function TJNIEnv.CallShortMethod(Obj: JObject; MethodID: JMethodID; const Args: array of const): JShort;
  1721. begin
  1722. Result := Env^.CallShortMethodA(Env, Obj, MethodID, ArgsToJValues(Args));
  1723. end;
  1724.  
  1725. function TJNIEnv.CallShortMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue): JShort;
  1726. begin
  1727. Result := Env^.CallShortMethodA(Env, Obj, MethodID, Args);
  1728. end;
  1729.  
  1730. function TJNIEnv.CallShortMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list): JShort;
  1731. begin
  1732. Result := Env^.CallShortMethodV(Env, Obj, MethodID, Args);
  1733. end;
  1734.  
  1735. function TJNIEnv.CallStaticBooleanMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JBoolean;
  1736. begin
  1737. Result := Env^.CallStaticBooleanMethodA(Env, AClass, MethodID, ArgsToJValues(Args));
  1738. end;
  1739.  
  1740. function TJNIEnv.CallStaticBooleanMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JBoolean;
  1741. begin
  1742. Result := Env^.CallStaticBooleanMethodA(Env, AClass, MethodID, Args);
  1743. end;
  1744.  
  1745. function TJNIEnv.CallStaticBooleanMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JBoolean;
  1746. begin
  1747. Result := Env^.CallStaticBooleanMethodV(Env, AClass, MethodID, Args);
  1748. end;
  1749.  
  1750. function TJNIEnv.CallStaticByteMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JByte;
  1751. begin
  1752. Result := Env^.CallStaticByteMethodA(Env, AClass, MethodID, ArgsToJValues(Args));
  1753. end;
  1754.  
  1755. function TJNIEnv.CallStaticByteMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JByte;
  1756. begin
  1757. Result := Env^.CallStaticByteMethodA(Env, AClass, MethodID, Args);
  1758. end;
  1759.  
  1760. function TJNIEnv.CallStaticByteMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JByte;
  1761. begin
  1762. Result := Env^.CallStaticByteMethodV(Env, AClass, MethodID, Args);
  1763. end;
  1764.  
  1765. function TJNIEnv.CallStaticCharMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JChar;
  1766. begin
  1767. Result := Env^.CallStaticCharMethodA(Env, AClass, MethodID, ArgsToJValues(Args));
  1768. end;
  1769.  
  1770. function TJNIEnv.CallStaticCharMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JChar;
  1771. begin
  1772. Result := Env^.CallStaticCharMethodA(Env, AClass, MethodID, Args);
  1773. end;
  1774.  
  1775. function TJNIEnv.CallStaticCharMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JChar;
  1776. begin
  1777. Result := Env^.CallStaticCharMethodV(Env, AClass, MethodID, Args);
  1778. end;
  1779.  
  1780. function TJNIEnv.CallStaticDoubleMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JDouble;
  1781. begin
  1782. Result := Env^.CallStaticDoubleMethodA(Env, AClass, MethodID, ArgsToJValues(Args));
  1783. end;
  1784.  
  1785. function TJNIEnv.CallStaticDoubleMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JDouble;
  1786. begin
  1787. Result := Env^.CallStaticDoubleMethodA(Env, AClass, MethodID, Args);
  1788. end;
  1789.  
  1790. function TJNIEnv.CallStaticDoubleMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JDouble;
  1791. begin
  1792. Result := Env^.CallStaticDoubleMethodV(Env, AClass, MethodID, Args);
  1793. end;
  1794.  
  1795. function TJNIEnv.CallStaticFloatMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JFloat;
  1796. begin
  1797. Result := Env^.CallStaticFloatMethodA(Env, AClass, MethodID, ArgsToJValues(Args));
  1798. end;
  1799.  
  1800. function TJNIEnv.CallStaticFloatMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JFloat;
  1801. begin
  1802. Result := Env^.CallStaticFloatMethodA(Env, AClass, MethodID, Args);
  1803. end;
  1804.  
  1805. function TJNIEnv.CallStaticFloatMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JFloat;
  1806. begin
  1807. Result := Env^.CallStaticFloatMethodV(Env, AClass, MethodID, Args);
  1808. end;
  1809.  
  1810. function TJNIEnv.CallStaticIntMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JInt;
  1811. begin
  1812. Result := Env^.CallStaticIntMethodA(Env, AClass, MethodID, ArgsToJValues(Args));
  1813. end;
  1814.  
  1815. function TJNIEnv.CallStaticIntMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JInt;
  1816. begin
  1817. Result := Env^.CallStaticIntMethodA(Env, AClass, MethodID, Args);
  1818. end;
  1819.  
  1820. function TJNIEnv.CallStaticIntMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JInt;
  1821. begin
  1822. Result := Env^.CallStaticIntMethodV(Env, AClass, MethodID, Args);
  1823. end;
  1824.  
  1825. function TJNIEnv.CallStaticLongMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JLong;
  1826. begin
  1827. Result := Env^.CallStaticLongMethodA(Env, AClass, MethodID, ArgsToJValues(Args));
  1828. end;
  1829.  
  1830. function TJNIEnv.CallStaticLongMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JLong;
  1831. begin
  1832. Result := Env^.CallStaticLongMethodA(Env, AClass, MethodID, Args);
  1833. end;
  1834.  
  1835. function TJNIEnv.CallStaticLongMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JLong;
  1836. begin
  1837. Result := Env^.CallStaticLongMethodV(Env, AClass, MethodID, Args);
  1838. end;
  1839.  
  1840. function TJNIEnv.CallStaticObjectMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JObject;
  1841. begin
  1842. Result := Env^.CallStaticObjectMethodA(Env, AClass, MethodID, ArgsToJValues(Args));
  1843. end;
  1844.  
  1845. function TJNIEnv.CallStaticObjectMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JObject;
  1846. begin
  1847. Result := Env^.CallStaticObjectMethodA(Env, AClass, MethodID, Args);
  1848. end;
  1849.  
  1850. function TJNIEnv.CallStaticObjectMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JObject;
  1851. begin
  1852. Result := Env^.CallStaticObjectMethodV(Env, AClass, MethodID, Args);
  1853. end;
  1854.  
  1855. function TJNIEnv.CallStaticShortMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const): JShort;
  1856. begin
  1857. Result := Env^.CallStaticShortMethodA(Env, AClass, MethodID, ArgsToJValues(Args));
  1858. end;
  1859.  
  1860. function TJNIEnv.CallStaticShortMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JShort;
  1861. begin
  1862. Result := Env^.CallStaticShortMethodA(Env, AClass, MethodID, Args);
  1863. end;
  1864.  
  1865. function TJNIEnv.CallStaticShortMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list): JShort;
  1866. begin
  1867. Result := Env^.CallStaticShortMethodV(Env, AClass, MethodID, Args);
  1868. end;
  1869.  
  1870. procedure TJNIEnv.CallStaticVoidMethod(AClass: JClass; MethodID: JMethodID; const Args: array of const);
  1871. begin
  1872. Env^.CallStaticVoidMethodA(Env, AClass, MethodID, ArgsToJValues(Args));
  1873. end;
  1874.  
  1875. procedure TJNIEnv.CallStaticVoidMethodA(AClass: JClass; MethodID: JMethodID; Args: PJValue);
  1876. begin
  1877. Env^.CallStaticVoidMethodA(Env, AClass, MethodID, Args);
  1878. end;
  1879.  
  1880. procedure TJNIEnv.CallStaticVoidMethodV(AClass: JClass; MethodID: JMethodID; Args: va_list);
  1881. begin
  1882. Env^.CallStaticVoidMethodV(Env, AClass, MethodID, Args);
  1883. end;
  1884.  
  1885. procedure TJNIEnv.CallVoidMethodA(Obj: JObject; MethodID: JMethodID; Args: PJValue);
  1886. begin
  1887. Env^.CallVoidMethodA(Env, Obj, MethodID, Args);
  1888. end;
  1889.  
  1890. procedure TJNIEnv.CallVoidMethodV(Obj: JObject; MethodID: JMethodID; Args: va_list);
  1891. begin
  1892. Env^.CallVoidMethodV(Env, Obj, MethodID, Args);
  1893. end;
  1894.  
  1895. function TJNIEnv.DefineClass(const Name: UTF8String; Loader: JObject; const Buf: PJByte; Len: JSize): JClass;
  1896. begin
  1897. Result := Env^.DefineClass(Env, PAnsiChar(Name), Loader, Buf, Len);
  1898. end;
  1899.  
  1900. procedure TJNIEnv.DeleteGlobalRef(GRef: JObject);
  1901. begin
  1902. Env^.DeleteGlobalRef(Env, GRef);
  1903. end;
  1904.  
  1905. procedure TJNIEnv.DeleteLocalRef(Obj: JObject);
  1906. begin
  1907. Env^.DeleteLocalRef(Env, Obj);
  1908. end;
  1909.  
  1910. procedure TJNIEnv.ExceptionClear;
  1911. begin
  1912. Env^.ExceptionClear(Env);
  1913. end;
  1914.  
  1915. procedure TJNIEnv.ExceptionDescribe;
  1916. begin
  1917. Env^.ExceptionDescribe(Env);
  1918. end;
  1919.  
  1920. function TJNIEnv.ExceptionOccurred: JThrowable;
  1921. begin
  1922. Result := Env^.ExceptionOccurred(Env);
  1923. end;
  1924.  
  1925. procedure TJNIEnv.FatalError(const Msg: UTF8String);
  1926. begin
  1927. Env^.FatalError(Env, PAnsiChar(Msg));
  1928. end;
  1929.  
  1930. function TJNIEnv.FindClass(const Name: UTF8String): JClass;
  1931. begin
  1932. Result := Env^.FindClass(Env, PAnsiChar(Name));
  1933. end;
  1934.  
  1935. function TJNIEnv.GetArrayLength(AArray: JArray): JSize;
  1936. begin
  1937. Result := Env^.GetArrayLength(Env, AArray);
  1938. end;
  1939.  
  1940. function TJNIEnv.GetBooleanArrayElements(AArray: JBooleanArray; var IsCopy: JBoolean): PJBoolean;
  1941. begin
  1942. Result := Env^.GetBooleanArrayElements(Env, AArray, @IsCopy);
  1943. end;
  1944.  
  1945. procedure TJNIEnv.GetBooleanArrayRegion(AArray: JBooleanArray; Start, Len: JSize; Buf: PJBoolean);
  1946. begin
  1947. Env^.GetBooleanArrayRegion(Env, AArray, Start, Len, Buf);
  1948. end;
  1949.  
  1950. function TJNIEnv.GetBooleanField(Obj: JObject; FieldID: JFieldID): JBoolean;
  1951. begin
  1952. Result := Env^.GetBooleanField(Env, Obj, FieldID);
  1953. end;
  1954.  
  1955. function TJNIEnv.GetByteArrayElements(AArray: JByteArray; var IsCopy: JBoolean): PJByte;
  1956. begin
  1957. Result := Env^.GetByteArrayElements(Env, AArray, @IsCopy);
  1958. end;
  1959.  
  1960. procedure TJNIEnv.GetByteArrayRegion(AArray: JByteArray; Start, Len: JSize; Buf: PJByte);
  1961. begin
  1962. Env^.GetByteArrayRegion(Env, AArray, Start, Len, Buf);
  1963. end;
  1964.  
  1965. function TJNIEnv.GetByteField(Obj: JObject; FieldID: JFieldID): JByte;
  1966. begin
  1967. Result := Env^.GetByteField(Env, Obj, FieldID);
  1968. end;
  1969.  
  1970. function TJNIEnv.GetCharArrayElements(AArray: JCharArray; var IsCopy: JBoolean): PJChar;
  1971. begin
  1972. Result := Env^.GetCharArrayElements(Env, AArray, @IsCopy);
  1973. end;
  1974.  
  1975. procedure TJNIEnv.GetCharArrayRegion(AArray: JCharArray; Start, Len: JSize; Buf: PJChar);
  1976. begin
  1977. Env^.GetCharArrayRegion(Env, AArray, Start, Len, Buf);
  1978. end;
  1979.  
  1980. function TJNIEnv.GetCharField(Obj: JObject; FieldID: JFieldID): JChar;
  1981. begin
  1982. Result := Env^.GetCharField(Env, Obj, FieldID);
  1983. end;
  1984.  
  1985. function TJNIEnv.GetDoubleArrayElements(AArray: JDoubleArray; var IsCopy: JBoolean): PJDouble;
  1986. begin
  1987. Result := Env^.GetDoubleArrayElements(Env, AArray, @IsCopy);
  1988. end;
  1989.  
  1990. procedure TJNIEnv.GetDoubleArrayRegion(AArray: JDoubleArray; Start, Len: JSize; Buf: PJDouble);
  1991. begin
  1992. Env^.GetDoubleArrayRegion(Env, AArray, Start, Len, Buf);
  1993. end;
  1994.  
  1995. function TJNIEnv.GetDoubleField(Obj: JObject; FieldID: JFieldID): JDouble;
  1996. begin
  1997. Result := Env^.GetDoubleField(Env, Obj, FieldID);
  1998. end;
  1999.  
  2000. function TJNIEnv.GetFieldID(AClass: JClass; const Name, Sig: UTF8String): JFieldID;
  2001. begin
  2002. Result := Env^.GetFieldID(Env, AClass, PAnsiChar(Name), PAnsiChar(Sig));
  2003. end;
  2004.  
  2005. function TJNIEnv.GetFloatArrayElements(AArray: JFloatArray; var IsCopy: JBoolean): PJFloat;
  2006. begin
  2007. Result := Env^.GetFloatArrayElements(Env, AArray, @IsCopy);
  2008. end;
  2009.  
  2010. procedure TJNIEnv.GetFloatArrayRegion(AArray: JFloatArray; Start, Len: JSize; Buf: PJFloat);
  2011. begin
  2012. Env^.GetFloatArrayRegion(Env, AArray, Start, Len, Buf);
  2013. end;
  2014.  
  2015. function TJNIEnv.GetFloatField(Obj: JObject; FieldID: JFieldID): JFloat;
  2016. begin
  2017. Result := Env^.GetFloatField(Env, Obj, FieldID);
  2018. end;
  2019.  
  2020. function TJNIEnv.GetIntArrayElements(AArray: JIntArray; var IsCopy: JBoolean): PJInt;
  2021. begin
  2022. Result := Env^.GetIntArrayElements(Env, AArray, @IsCopy);
  2023. end;
  2024.  
  2025. procedure TJNIEnv.GetIntArrayRegion(AArray: JIntArray; Start, Len: JSize; Buf: PJInt);
  2026. begin
  2027. Env^.GetIntArrayRegion(Env, AArray, Start, Len, Buf);
  2028. end;
  2029.  
  2030. function TJNIEnv.GetIntField(Obj: JObject; FieldID: JFieldID): JInt;
  2031. begin
  2032. Result := Env^.GetIntField(Env, Obj, FieldID);
  2033. end;
  2034.  
  2035. function TJNIEnv.GetJavaVM(var VM: JavaVM): JInt;
  2036. begin
  2037. Result := Env^.GetJavaVM(Env, @VM);
  2038. end;
  2039.  
  2040. function TJNIEnv.GetLongArrayElements(AArray: JLongArray; var IsCopy: JBoolean): PJLong;
  2041. begin
  2042. Result := Env^.GetLongArrayElements(Env, AArray, @IsCopy);
  2043. end;
  2044.  
  2045. procedure TJNIEnv.GetLongArrayRegion(AArray: JLongArray; Start, Len: JSize; Buf: PJLong);
  2046. begin
  2047. Env^.GetLongArrayRegion(Env, AArray, Start, Len, Buf);
  2048. end;
  2049.  
  2050. function TJNIEnv.GetLongField(Obj: JObject; FieldID: JFieldID): JLong;
  2051. begin
  2052. Result := Env^.GetLongField(Env, Obj, FieldID);
  2053. end;
  2054.  
  2055. function TJNIEnv.GetMethodID(AClass: JClass; const Name, Sig: UTF8String): JMethodID;
  2056. begin
  2057. Result := Env^.GetMethodID(Env, AClass, PAnsiChar(Name), PAnsiChar(Sig));
  2058. end;
  2059.  
  2060. function TJNIEnv.GetObjectArrayElement(AArray: JObjectArray; Index: JSize): JObject;
  2061. begin
  2062. Result := Env^.GetObjectArrayElement(Env, AArray, Index);
  2063. end;
  2064.  
  2065. function TJNIEnv.GetObjectClass(Obj: JObject): JClass;
  2066. begin
  2067. Result := Env^.GetObjectClass(Env, Obj);
  2068. end;
  2069.  
  2070. function TJNIEnv.GetObjectField(Obj: JObject; FieldID: JFieldID): JObject;
  2071. begin
  2072. Result := Env^.GetObjectField(Env, Obj, FieldID);
  2073. end;
  2074.  
  2075. function TJNIEnv.GetShortArrayElements(AArray: JShortArray; var IsCopy: JBoolean): PJShort;
  2076. begin
  2077. Result := Env^.GetShortArrayElements(Env, AArray, @IsCopy);
  2078. end;
  2079.  
  2080. procedure TJNIEnv.GetShortArrayRegion(AArray: JShortArray; Start, Len: JSize; Buf: PJShort);
  2081. begin
  2082. Env^.GetShortArrayRegion(Env, AArray, Start, Len, Buf);
  2083. end;
  2084.  
  2085. function TJNIEnv.GetShortField(Obj: JObject; FieldID: JFieldID): JShort;
  2086. begin
  2087. Result := Env^.GetShortField(Env, Obj, FieldID);
  2088. end;
  2089.  
  2090. function TJNIEnv.GetStaticBooleanField(AClass: JClass; FieldID: JFieldID): JBoolean;
  2091. begin
  2092. Result := Env^.GetStaticBooleanField(Env, AClass, FieldID);
  2093. end;
  2094.  
  2095. function TJNIEnv.GetStaticByteField(AClass: JClass; FieldID: JFieldID): JByte;
  2096. begin
  2097. Result := Env^.GetStaticByteField(Env, AClass, FieldID);
  2098. end;
  2099.  
  2100. function TJNIEnv.GetStaticCharField(AClass: JClass; FieldID: JFieldID): JChar;
  2101. begin
  2102. Result := Env^.GetStaticCharField(Env, AClass, FieldID);
  2103. end;
  2104.  
  2105. function TJNIEnv.GetStaticDoubleField(AClass: JClass; FieldID: JFieldID): JDouble;
  2106. begin
  2107. Result := Env^.GetStaticDoubleField(Env, AClass, FieldID);
  2108. end;
  2109.  
  2110. function TJNIEnv.GetStaticFieldID(AClass: JClass; const Name, Sig: UTF8String): JFieldID;
  2111. begin
  2112. Result := Env^.GetStaticFieldID(Env, AClass, PAnsiChar(Name), PAnsiChar(Sig));
  2113. end;
  2114.  
  2115. function TJNIEnv.GetStaticFloatField(AClass: JClass; FieldID: JFieldID): JFloat;
  2116. begin
  2117. Result := Env^.GetStaticFloatField(Env, AClass, FieldID);
  2118. end;
  2119.  
  2120. function TJNIEnv.GetStaticIntField(AClass: JClass; FieldID: JFieldID): JInt;
  2121. begin
  2122. Result := Env^.GetStaticIntField(Env, AClass, FieldID);
  2123. end;
  2124.  
  2125. function TJNIEnv.GetStaticLongField(AClass: JClass; FieldID: JFieldID): JLong;
  2126. begin
  2127. Result := Env^.GetStaticLongField(Env, AClass, FieldID);
  2128. end;
  2129.  
  2130. function TJNIEnv.GetStaticMethodID(AClass: JClass; const Name, Sig: UTF8String): JMethodID;
  2131. begin
  2132. Result := Env^.GetStaticMethodID(Env, AClass, PAnsiChar(Name), PAnsiChar(Sig));
  2133. end;
  2134.  
  2135. function TJNIEnv.GetStaticObjectField(AClass: JClass; FieldID: JFieldID): JObject;
  2136. begin
  2137. Result := Env^.GetStaticObjectField(Env, AClass, FieldID);
  2138. end;
  2139.  
  2140. function TJNIEnv.GetStaticShortField(AClass: JClass; FieldID: JFieldID): JShort;
  2141. begin
  2142. Result := Env^.GetStaticShortField(Env, AClass, FieldID);
  2143. end;
  2144.  
  2145. function TJNIEnv.GetStringChars(Str: JString; var IsCopy: JBoolean): PJChar;
  2146. begin
  2147. Result := Env^.GetStringChars(Env, Str, @IsCopy);
  2148. end;
  2149.  
  2150. function TJNIEnv.GetStringLength(Str: JString): JSize;
  2151. begin
  2152. Result := Env^.GetStringLength(Env, Str);
  2153. end;
  2154.  
  2155. function TJNIEnv.GetStringUTFChars(Str: JString; var IsCopy: JBoolean): PAnsiChar;
  2156. begin
  2157. Result := Env^.GetStringUTFChars(Env, Str, @IsCopy);
  2158. end;
  2159.  
  2160. function TJNIEnv.GetStringUTFLength(Str: JString): JSize;
  2161. begin
  2162. Result := Env^.GetStringUTFLength(Env, Str);
  2163. end;
  2164.  
  2165. function TJNIEnv.GetSuperclass(Sub: JClass): JClass;
  2166. begin
  2167. Result := Env^.GetSuperclass(Env, Sub);
  2168. end;
  2169.  
  2170. function TJNIEnv.IsAssignableFrom(Sub, Sup: JClass): JBoolean;
  2171. begin
  2172. Result := Env^.IsAssignableFrom(Env, Sub, Sup);
  2173. end;
  2174.  
  2175. function TJNIEnv.IsInstanceOf(Obj: JObject; AClass: JClass): JBoolean;
  2176. begin
  2177. Result := Env^.IsInstanceOf(Env, Obj, AClass);
  2178. end;
  2179.  
  2180. function TJNIEnv.IsSameObject(Obj1, Obj2: JObject): JBoolean;
  2181. begin
  2182. Result := Env^.IsSameObject(Env, Obj1, Obj2);
  2183. end;
  2184.  
  2185. function TJNIEnv.MonitorEnter(Obj: JObject): JInt;
  2186. begin
  2187. Result := Env^.MonitorEnter(Env, Obj);
  2188. end;
  2189.  
  2190. function TJNIEnv.MonitorExit(Obj: JObject): JInt;
  2191. begin
  2192. Result := Env^.MonitorExit(Env, Obj);
  2193. end;
  2194.  
  2195. function TJNIEnv.NewBooleanArray(Len: JSize): JBooleanArray;
  2196. begin
  2197. Result := Env^.NewBooleanArray(Env, Len);
  2198. end;
  2199.  
  2200. function TJNIEnv.NewByteArray(Len: JSize): JByteArray;
  2201. begin
  2202. Result := Env^.NewByteArray(Env, Len);
  2203. end;
  2204.  
  2205. function TJNIEnv.NewCharArray(Len: JSize): JCharArray;
  2206. begin
  2207. Result := Env^.NewCharArray(Env, Len);
  2208. end;
  2209.  
  2210. function TJNIEnv.NewDoubleArray(Len: JSize): JDoubleArray;
  2211. begin
  2212. Result := Env^.NewDoubleArray(Env, Len);
  2213. end;
  2214.  
  2215. function TJNIEnv.NewFloatArray(Len: JSize): JFloatArray;
  2216. begin
  2217. Result := Env^.NewFloatArray(Env, Len);
  2218. end;
  2219.  
  2220. function TJNIEnv.NewGlobalRef(LObj: JObject): JObject;
  2221. begin
  2222. Result := Env^.NewGlobalRef(Env, LObj);
  2223. end;
  2224.  
  2225. function TJNIEnv.NewIntArray(Len: JSize): JIntArray;
  2226. begin
  2227. Result := Env^.NewIntArray(Env, Len);
  2228. end;
  2229.  
  2230. function TJNIEnv.NewLongArray(Len: JSize): JLongArray;
  2231. begin
  2232. Result := Env^.NewLongArray(Env, Len);
  2233. end;
  2234.  
  2235. function TJNIEnv.NewObject(AClass: JClass; MethodID: JMethodID; const Args: array of const): JObject;
  2236. begin
  2237. Result := Env^.NewObjectA(Env, AClass, MethodID, ArgsToJValues(Args));
  2238. end;
  2239.  
  2240. function TJNIEnv.NewObjectA(AClass: JClass; MethodID: JMethodID; Args: PJValue): JObject;
  2241. begin
  2242. Result := Env^.NewObjectA(Env, AClass, MethodID, Args);
  2243. end;
  2244.  
  2245. function TJNIEnv.NewObjectV(AClass: JClass; MethodID: JMethodID; Args: va_list): JObject;
  2246. begin
  2247. Result := Env^.NewObjectV(Env, AClass, MethodID, Args);
  2248. end;
  2249.  
  2250. function TJNIEnv.NewObjectArray(Len: JSize; AClass: JClass; Init: JObject): JObjectArray;
  2251. begin
  2252. Result := Env^.NewObjectArray(Env, Len, AClass, Init);
  2253. end;
  2254.  
  2255. function TJNIEnv.NewShortArray(Len: JSize): JShortArray;
  2256. begin
  2257. Result := Env^.NewShortArray(Env, Len);
  2258. end;
  2259.  
  2260. function TJNIEnv.NewString(const Unicode: PJChar; Len: JSize): JString;
  2261. begin
  2262. Result := Env^.NewString(Env, Unicode, Len);
  2263. end;
  2264.  
  2265. function TJNIEnv.NewStringUTF(const UTF: PAnsiChar): JString;
  2266. begin
  2267. Result := Env^.NewStringUTF(Env, UTF);
  2268. end;
  2269.  
  2270. function TJNIEnv.RegisterNatives(AClass: JClass; const Methods: PJNINativeMethod; NMethods: JInt): JInt;
  2271. begin
  2272. Result := Env^.RegisterNatives(Env, AClass, Methods, NMethods);
  2273. end;
  2274.  
  2275. function TJNIEnv.UnregisterNatives(AClass: JClass): JInt;
  2276. begin
  2277. Result := Env^.UnregisterNatives(Env, AClass);
  2278. end;
  2279.  
  2280. procedure TJNIEnv.ReleaseBooleanArrayElements(AArray: JBooleanArray; Elems: PJBoolean; Mode: JInt);
  2281. begin
  2282. Env^.ReleaseBooleanArrayElements(Env, AArray, Elems, Mode);
  2283. end;
  2284.  
  2285. procedure TJNIEnv.ReleaseByteArrayElements(AArray: JByteArray; Elems: PJByte; Mode: JInt);
  2286. begin
  2287. Env^.ReleaseByteArrayElements(Env, AArray, Elems, Mode);
  2288. end;
  2289.  
  2290. procedure TJNIEnv.ReleaseCharArrayElements(AArray: JCharArray; Elems: PJChar; Mode: JInt);
  2291. begin
  2292. Env^.ReleaseCharArrayElements(Env, AArray, Elems, Mode);
  2293. end;
  2294.  
  2295. procedure TJNIEnv.ReleaseDoubleArrayElements(AArray: JDoubleArray; Elems: PJDouble; Mode: JInt);
  2296. begin
  2297. Env^.ReleaseDoubleArrayElements(Env, AArray, Elems, Mode);
  2298. end;
  2299.  
  2300. procedure TJNIEnv.ReleaseFloatArrayElements(AArray: JFloatArray; Elems: PJFloat; Mode: JInt);
  2301. begin
  2302. Env^.ReleaseFloatArrayElements(Env, AArray, Elems, Mode);
  2303. end;
  2304.  
  2305. procedure TJNIEnv.ReleaseIntArrayElements(AArray: JIntArray; Elems: PJInt; Mode: JInt);
  2306. begin
  2307. Env^.ReleaseIntArrayElements(Env, AArray, Elems, Mode);
  2308. end;
  2309.  
  2310. procedure TJNIEnv.ReleaseLongArrayElements(AArray: JLongArray; Elems: PJLong; Mode: JInt);
  2311. begin
  2312. Env^.ReleaseLongArrayElements(Env, AArray, Elems, Mode);
  2313. end;
  2314.  
  2315. procedure TJNIEnv.ReleaseShortArrayElements(AArray: JShortArray; Elems: PJShort; Mode: JInt);
  2316. begin
  2317. Env^.ReleaseShortArrayElements(Env, AArray, Elems, Mode);
  2318. end;
  2319.  
  2320. procedure TJNIEnv.ReleaseStringChars(Str: JString; const Chars: PJChar);
  2321. begin
  2322. Env^.ReleaseStringChars(Env, Str, Chars);
  2323. end;
  2324.  
  2325. procedure TJNIEnv.ReleaseStringUTFChars(Str: JString; const Chars: PAnsiChar);
  2326. begin
  2327. Env^.ReleaseStringUTFChars(Env, Str, Chars);
  2328. end;
  2329.  
  2330. procedure TJNIEnv.SetBooleanArrayRegion(AArray: JBooleanArray; Start, Len: JSize; Buf: PJBoolean);
  2331. begin
  2332. Env^.SetBooleanArrayRegion(Env, AArray, Start, Len, Buf);
  2333. end;
  2334.  
  2335. procedure TJNIEnv.SetBooleanField(Obj: JObject; FieldID: JFieldID; Val: JBoolean);
  2336. begin
  2337. Env^.SetBooleanField(Env, Obj, FieldID, Val);
  2338. end;
  2339.  
  2340. procedure TJNIEnv.SetByteArrayRegion(AArray: JByteArray; Start, Len: JSize; Buf: PJByte);
  2341. begin
  2342. Env^.SetByteArrayRegion(Env, AArray, Start, Len, Buf);
  2343. end;
  2344.  
  2345. procedure TJNIEnv.SetByteField(Obj: JObject; FieldID: JFieldID; Val: JByte);
  2346. begin
  2347. Env^.SetByteField(Env, Obj, FieldID, Val);
  2348. end;
  2349.  
  2350. procedure TJNIEnv.SetCharArrayRegion(AArray: JCharArray; Start, Len: JSize; Buf: PJChar);
  2351. begin
  2352. Env^.SetCharArrayRegion(Env, AArray, Start, Len, Buf);
  2353. end;
  2354.  
  2355. procedure TJNIEnv.SetCharField(Obj: JObject; FieldID: JFieldID; Val: JChar);
  2356. begin
  2357. Env^.SetCharField(Env, Obj, FieldID, Val);
  2358. end;
  2359.  
  2360. procedure TJNIEnv.SetDoubleArrayRegion(AArray: JDoubleArray; Start, Len: JSize; Buf: PJDouble);
  2361. begin
  2362. Env^.SetDoubleArrayRegion(Env, AArray, Start, Len, Buf);
  2363. end;
  2364.  
  2365. procedure TJNIEnv.SetDoubleField(Obj: JObject; FieldID: JFieldID; Val: JDouble);
  2366. begin
  2367. Env^.SetDoubleField(Env, Obj, FieldID, Val);
  2368. end;
  2369.  
  2370. procedure TJNIEnv.SetFloatArrayRegion(AArray: JFloatArray; Start, Len: JSize; Buf: PJFloat);
  2371. begin
  2372. Env^.SetFloatArrayRegion(Env, AArray, Start, Len, Buf);
  2373. end;
  2374.  
  2375. procedure TJNIEnv.SetFloatField(Obj: JObject; FieldID: JFieldID; Val: JFloat);
  2376. begin
  2377. Env^.SetFloatField(Env, Obj, FieldID, Val);
  2378. end;
  2379.  
  2380. procedure TJNIEnv.SetIntArrayRegion(AArray: JIntArray; Start, Len: JSize; Buf: PJInt);
  2381. begin
  2382. Env^.SetIntArrayRegion(Env, AArray, Start, Len, Buf);
  2383. end;
  2384.  
  2385. procedure TJNIEnv.SetIntField(Obj: JObject; FieldID: JFieldID; Val: JInt);
  2386. begin
  2387. Env^.SetIntField(Env, Obj, FieldID, Val);
  2388. end;
  2389.  
  2390. procedure TJNIEnv.SetLongArrayRegion(AArray: JLongArray; Start, Len: JSize; Buf: PJLong);
  2391. begin
  2392. Env^.SetLongArrayRegion(Env, AArray, Start, Len, Buf);
  2393. end;
  2394.  
  2395. procedure TJNIEnv.SetLongField(Obj: JObject; FieldID: JFieldID; Val: JLong);
  2396. begin
  2397. Env^.SetLongField(Env, Obj, FieldID, Val);
  2398. end;
  2399.  
  2400. procedure TJNIEnv.SetObjectArrayElement(AArray: JObjectArray; Index: JSize; Val: JObject);
  2401. begin
  2402. Env^.SetObjectArrayElement(Env, AArray, Index, Val);
  2403. end;
  2404.  
  2405. procedure TJNIEnv.SetObjectField(Obj: JObject; FieldID: JFieldID; Val: JObject);
  2406. begin
  2407. Env^.SetObjectField(Env, Obj, FieldID, Val);
  2408. end;
  2409.  
  2410. procedure TJNIEnv.SetShortArrayRegion(AArray: JShortArray; Start, Len: JSize; Buf: PJShort);
  2411. begin
  2412. Env^.SetShortArrayRegion(Env, AArray, Start, Len, Buf);
  2413. end;
  2414.  
  2415. procedure TJNIEnv.SetShortField(Obj: JObject; FieldID: JFieldID; Val: JShort);
  2416. begin
  2417. Env^.SetShortField(Env, Obj, FieldID, Val);
  2418. end;
  2419.  
  2420. procedure TJNIEnv.SetStaticBooleanField(AClass: JClass; FieldID: JFieldID; Val: JBoolean);
  2421. begin
  2422. Env^.SetStaticBooleanField(Env, AClass, FieldID, Val);
  2423. end;
  2424.  
  2425. procedure TJNIEnv.SetStaticByteField(AClass: JClass; FieldID: JFieldID; Val: JByte);
  2426. begin
  2427. Env^.SetStaticByteField(Env, AClass, FieldID, Val);
  2428. end;
  2429.  
  2430. procedure TJNIEnv.SetStaticCharField(AClass: JClass; FieldID: JFieldID; Val: JChar);
  2431. begin
  2432. Env^.SetStaticCharField(Env, AClass, FieldID, Val);
  2433. end;
  2434.  
  2435. procedure TJNIEnv.SetStaticDoubleField(AClass: JClass; FieldID: JFieldID; Val: JDouble);
  2436. begin
  2437. Env^.SetStaticDoubleField(Env, AClass, FieldID, Val);
  2438. end;
  2439.  
  2440. procedure TJNIEnv.SetStaticFloatField(AClass: JClass; FieldID: JFieldID; Val: JFloat);
  2441. begin
  2442. Env^.SetStaticFloatField(Env, AClass, FieldID, Val);
  2443. end;
  2444.  
  2445. procedure TJNIEnv.SetStaticIntField(AClass: JClass; FieldID: JFieldID; Val: JInt);
  2446. begin
  2447. Env^.SetStaticIntField(Env, AClass, FieldID, Val);
  2448. end;
  2449.  
  2450. procedure TJNIEnv.SetStaticLongField(AClass: JClass; FieldID: JFieldID; Val: JLong);
  2451. begin
  2452. Env^.SetStaticLongField(Env, AClass, FieldID, Val);
  2453. end;
  2454.  
  2455. procedure TJNIEnv.SetStaticObjectField(AClass: JClass; FieldID: JFieldID; Val: JObject);
  2456. begin
  2457. Env^.SetStaticObjectField(Env, AClass, FieldID, Val);
  2458. end;
  2459.  
  2460. procedure TJNIEnv.SetStaticShortField(AClass: JClass; FieldID: JFieldID; Val: JShort);
  2461. begin
  2462. Env^.SetStaticShortField(Env, AClass, FieldID, Val);
  2463. end;
  2464.  
  2465. function TJNIEnv.Throw(Obj: JThrowable): JInt;
  2466. begin
  2467. Result := Env^.Throw(Env, Obj);
  2468. end;
  2469.  
  2470. function TJNIEnv.ThrowNew(AClass: JClass; const Msg: UTF8String): JInt;
  2471. begin
  2472. Result := Env^.ThrowNew(Env, AClass, PAnsiChar(Msg));
  2473. end;
  2474.  
  2475. procedure TJNIEnv.DeleteWeakGlobalRef(Ref: JWeak);
  2476. begin
  2477. VersionCheck('DeleteWeakGlobalRef', JNI_VERSION_1_2);
  2478. Env^.DeleteWeakGlobalRef(Env, Ref);
  2479. end;
  2480.  
  2481. function TJNIEnv.EnsureLocalCapacity(Capacity: JInt): JInt;
  2482. begin
  2483. Result := Env^.EnsureLocalCapacity(Env, Capacity);
  2484. end;
  2485.  
  2486. function TJNIEnv.ExceptionCheck: JBoolean;
  2487. begin
  2488. VersionCheck('ExceptionCheck', JNI_VERSION_1_2);
  2489. Result := Env^.ExceptionCheck(Env)
  2490. end;
  2491.  
  2492. function TJNIEnv.FromReflectedField(field: JObject): JFieldID;
  2493. begin
  2494. VersionCheck('FromReflectedField', JNI_VERSION_1_2);
  2495. Result := Env^.FromReflectedField(Env, Field);
  2496. end;
  2497.  
  2498. function TJNIEnv.FromReflectedMethod(method: JObject): JMethodID;
  2499. begin
  2500. VersionCheck('FromReflectedMethod', JNI_VERSION_1_2);
  2501. Result := Env^.FromReflectedMethod(Env, Method);
  2502. end;
  2503.  
  2504. function TJNIEnv.GetPrimitiveArrayCritical(AArray: JArray; var IsCopy: JBoolean): Pointer;
  2505. begin
  2506. VersionCheck('GetPrimitiveArrayCritical', JNI_VERSION_1_2);
  2507. Result := Env^.GetPrimitiveArrayCritical(Env, AArray, @IsCopy);
  2508. end;
  2509.  
  2510. function TJNIEnv.GetStringCritical(Str: JString; var IsCopy: JBoolean): PJChar;
  2511. begin
  2512. VersionCheck('GetStringCritical', JNI_VERSION_1_2);
  2513. Result := Env^.GetStringCritical(Env, Str, @IsCopy);
  2514. end;
  2515.  
  2516. procedure TJNIEnv.GetStringRegion(Str: JString; Start, Len: JSize; Buf: PJChar);
  2517. begin
  2518. VersionCheck('GetStringRegion', JNI_VERSION_1_2);
  2519. Env^.GetStringRegion(Env, Str, Start, Len, Buf);
  2520. end;
  2521.  
  2522. procedure TJNIEnv.GetStringUTFRegion(Str: JString; Start, Len: JSize; Buf: PAnsiChar);
  2523. begin
  2524. VersionCheck('GetStringUTFRegion', JNI_VERSION_1_2);
  2525. Env^.GetStringUTFRegion(Env, Str, Start, Len, Buf);
  2526. end;
  2527.  
  2528. function TJNIEnv.NewLocalRef(Ref: JObject): JObject;
  2529. begin
  2530. VersionCheck('NewLocalRef', JNI_VERSION_1_2);
  2531. Result := Env^.NewLocalRef(Env, Ref);
  2532. end;
  2533.  
  2534. function TJNIEnv.NewWeakGlobalRef(Obj: JObject): JWeak;
  2535. begin
  2536. VersionCheck('NewWeakGlobalRef', JNI_VERSION_1_2);
  2537. Result := Env^.NewWeakGlobalRef(Env, Obj);
  2538. end;
  2539.  
  2540. function TJNIEnv.PopLocalFrame(AResult: JObject): JObject;
  2541. begin
  2542. VersionCheck('PopLocalFrame', JNI_VERSION_1_2);
  2543. Result := Env^.PopLocalFrame(Env, AResult);
  2544. end;
  2545.  
  2546. function TJNIEnv.PushLocalFrame(Capacity: JInt): JInt;
  2547. begin
  2548. VersionCheck('PushLocalFrame', JNI_VERSION_1_2);
  2549. Result := Env^.PushLocalFrame(Env, Capacity);
  2550. end;
  2551.  
  2552. procedure TJNIEnv.ReleasePrimitiveArrayCritical(AArray: JArray; CArray: Pointer; Mode: JInt);
  2553. begin
  2554. VersionCheck('ReleasePrimitiveArrayCritical', JNI_VERSION_1_2);
  2555. Env^.ReleasePrimitiveArrayCritical(Env, AArray, CArray, Mode);
  2556. end;
  2557.  
  2558. procedure TJNIEnv.ReleaseStringCritical(Str: JString; CString: PJChar);
  2559. begin
  2560. VersionCheck('ReleaseStringCritical', JNI_VERSION_1_2);
  2561. Env^.ReleaseStringCritical(Env, Str, CString);
  2562. end;
  2563.  
  2564. function TJNIEnv.ToReflectedField(AClass: JClass; FieldID: JFieldID; IsStatic: JBoolean): JObject;
  2565. begin
  2566. VersionCheck('ToReflectedField', JNI_VERSION_1_2);
  2567. Result := Env^.ToReflectedField(Env, AClass, FieldID, IsStatic);
  2568. end;
  2569.  
  2570. function TJNIEnv.ToReflectedMethod(AClass: JClass; MethodID: JMethodID; IsStatic: JBoolean): JObject;
  2571. begin
  2572. VersionCheck('ToReflectedMethod', JNI_VERSION_1_2);
  2573. Result := Env^.ToReflectedMethod(Env, AClass, MethodID, IsStatic);
  2574. end;
  2575.  
  2576. function TJNIEnv.NewDirectByteBuffer(Address: Pointer; Capacity: JLong): JObject;
  2577. begin
  2578. VersionCheck('NewDirectByteBuffer', JNI_VERSION_1_4);
  2579. Result := Env^.NewDirectByteBuffer(Env, Address, Capacity);
  2580. end;
  2581.  
  2582. function TJNIEnv.GetDirectBufferAddress(Buf: JObject): Pointer;
  2583. begin
  2584. VersionCheck('GetDirectBufferAddress', JNI_VERSION_1_4);
  2585. Result := Env^.GetDirectBufferAddress(Env, Buf);
  2586. end;
  2587.  
  2588. function TJNIEnv.GetDirectBufferCapacity(Buf: JObject): JLong;
  2589. begin
  2590. VersionCheck('GetDirectBufferCapacity', JNI_VERSION_1_4);
  2591. Result := Env^.GetDirectBufferCapacity(Env, Buf);
  2592. end;
  2593.  
  2594. { TJavaVM }
  2595. constructor TJavaVM.Create;
  2596. begin
  2597. {$IFDEF DYNAMIC_LINKING}
  2598. // We need to know which DLL to load if we're linking at runtime
  2599. raise EJVMError.Create('No JDK version specified');
  2600. {$ELSE}
  2601. FJNI_GetDefaultJavaVMInitArgs := @JNI_GetDefaultJavaVMInitArgs;
  2602. FJNI_CreateJavaVM := @JNI_CreateJavaVM;
  2603. FJNI_GetCreatedJavaVMs := @JNI_GetCreatedJavaVMs;
  2604. FIsInitialized := True;
  2605. {$ENDIF}
  2606. end;
  2607.  
  2608. {$IFDEF MSWINDOWS}
  2609.  
  2610. constructor TJavaVM.Create(JDKVersion: Integer);
  2611. begin
  2612. case JDKVersion of
  2613. JNI_VERSION_1_1:
  2614. Create(JDKVersion, 'javai.dll');
  2615. JNI_VERSION_1_2, JNI_VERSION_1_4, JNI_VERSION_1_6, JNI_VERSION_1_7:
  2616. Create(JDKVersion, 'jvm.dll');
  2617. else
  2618. raise Exception.Create('Unknown JDK Version');
  2619. end;
  2620. end;
  2621.  
  2622. constructor TJavaVM.Create(JDKVersion: Integer; const JVMDLLFilename: string);
  2623. begin
  2624. FIsInitialized := False;
  2625. FJVMDLLFile := JVMDLLFilename;
  2626. Version := JDKVersion;
  2627.  
  2628. FJavaVM := nil;
  2629. FEnv := nil;
  2630.  
  2631. FDLLHandle := LoadLibrary(PChar(FJVMDLLFile));
  2632. if FDLLHandle = 0 then
  2633. raise EJVMError.CreateFmt('LoadLibrary failed trying to load %s', [FJVMDLLFile]);
  2634. try
  2635. @FJNI_CreateJavaVM := GetProcAddress(FDLLHandle, 'JNI_CreateJavaVM');
  2636. if not Assigned(FJNI_CreateJavaVM) then
  2637. raise EJVMError.CreateFmt('GetProcAddress failed to locate JNI_CreateJavaVM in library %s', [FJVMDLLFile]);
  2638.  
  2639. @FJNI_GetDefaultJavaVMInitArgs := GetProcAddress(FDLLHandle, 'JNI_GetDefaultJavaVMInitArgs');
  2640. if not Assigned(FJNI_GetDefaultJavaVMInitArgs) then
  2641. raise EJVMError.CreateFmt('GetProcAddress failed to locate JNI_GetDefaultJavaVMInitArgs in library %s', [FJVMDLLFile]);
  2642.  
  2643. @FJNI_GetCreatedJavaVMs := GetProcAddress(FDLLHandle, 'JNI_GetCreatedJavaVMs');
  2644. if not Assigned(FJNI_GetCreatedJavaVMs) then
  2645. raise EJVMError.CreateFmt('GetProcAddress failed to locate JNI_GetCreatedJavaVMs in library %s', [FJVMDLLFile]);
  2646. except
  2647. FreeLibrary(FDLLHandle);
  2648. FDLLHandle := 0;
  2649. raise;
  2650. end;
  2651.  
  2652. FIsInitialized := True;
  2653. end;
  2654.  
  2655. destructor TJavaVM.Destroy;
  2656. begin
  2657. if FDLLHandle <> 0 then
  2658. FreeLibrary(FDLLHandle);
  2659. inherited Destroy;
  2660. end;
  2661.  
  2662. {$ENDIF} // MSWINDOWS
  2663.  
  2664. {$IFDEF LINUX}
  2665.  
  2666. constructor TJavaVM.Create(JDKVersion: Integer);
  2667. begin
  2668. if JDKVersion = JNI_VERSION_1_1 then
  2669. Create(JDKVersion, 'libjava.so')
  2670. else
  2671. if JDKVersion = JNI_VERSION_1_2 then
  2672. Create(JDKVersion, 'libjvm.so')
  2673. else
  2674. raise EJVMError.Create('Unknown JDK Version');
  2675. end;
  2676.  
  2677. constructor TJavaVM.Create(JDKVersion: Integer; const JVMDLLFilename: string);
  2678. begin
  2679. FIsInitialized := False;
  2680. FJVMDLLFile := JVMDLLFilename;
  2681. Version := JDKVersion;
  2682.  
  2683. FJavaVM := nil;
  2684. FEnv := nil;
  2685.  
  2686. FDLLHandle := dlopen(PChar(FJVMDLLFile), RTLD_NOW);
  2687. if FDLLHandle = nil then
  2688. raise EJVMError.CreateFmt('dlopen failed trying to load %s', [FJVMDLLFile]);
  2689. try
  2690. @FJNI_CreateJavaVM := dlsym(FDLLHandle, 'JNI_CreateJavaVM');
  2691. if not Assigned(FJNI_CreateJavaVM) then
  2692. raise Exception.CreateFmt('dlsym failed to locate JNI_CreateJavaVM in library %s', [FJVMDLLFile]);
  2693.  
  2694. @FJNI_GetDefaultJavaVMInitArgs := dlsym(FDLLHandle, 'JNI_GetDefaultJavaVMInitArgs');
  2695. if not Assigned(FJNI_GetDefaultJavaVMInitArgs) then
  2696. raise Exception.CreateFmt('dlsym failed to locate JNI_GetDefaultJavaVMInitArgs in library %s', [FJVMDLLFile]);
  2697.  
  2698. @FJNI_GetCreatedJavaVMs := dlsym(FDLLHandle, 'JNI_GetCreatedJavaVMs');
  2699. if not Assigned(FJNI_GetCreatedJavaVMs) then
  2700. raise Exception.CreateFmt('dlsym failed to locate JNI_GetCreatedJavaVMs in library %s', [FJVMDLLFile]);
  2701. except
  2702. dlclose(FDLLHandle);
  2703. FDLLHandle := nil;
  2704. raise;
  2705. end;
  2706.  
  2707. FIsInitialized := True;
  2708. end;
  2709.  
  2710. destructor TJavaVM.Destroy;
  2711. begin
  2712. if FDLLHandle <> nil then
  2713. dlclose(FDLLHandle);
  2714. inherited Destroy;
  2715. end;
  2716.  
  2717. {$ENDIF} // LINUX
  2718.  
  2719. function TJavaVM.GetCreatedJavaVMs(PJVM: PPJavaVM; JSize1: JSize; var JSize2: JSize): JInt;
  2720. begin
  2721. if not FIsInitialized then
  2722. raise EJVMError.Create('JavaVM has not been initialized');
  2723. Result := FJNI_GetCreatedJavaVMs(PJVM, JSize1, @JSize2);
  2724. end;
  2725.  
  2726. function TJavaVM.GetDefaultJavaVMInitArgs(var Args: JDK1_1InitArgs): JInt;
  2727. begin
  2728. if not FIsInitialized then
  2729. raise EJVMError.Create('JavaVM has not been initialized');
  2730. Result := FJNI_GetDefaultJavaVMInitArgs(@Args);
  2731. end;
  2732.  
  2733. function TJavaVM.LoadVM(const Options: JDK1_1InitArgs): JInt;
  2734. begin
  2735. if not FIsInitialized then
  2736. raise EJVMError.Create('JavaVM has not been initialized');
  2737. FJDK1_1InitArgs := Options;
  2738. Result := FJNI_CreateJavaVM(@FJavaVM, @FEnv, @FJDK1_1InitArgs)
  2739. end;
  2740.  
  2741. function TJavaVM.LoadVM(const Options: JavaVMInitArgs): JInt;
  2742. begin
  2743. if not FIsInitialized then
  2744. raise EJVMError.Create('JavaVM has not been initialized');
  2745. FJavaVMInitArgs := Options;
  2746. Result := FJNI_CreateJavaVM(@FJavaVM, @FEnv, @FJavaVMInitArgs);
  2747. end;
  2748.  
  2749. function TJavaVM.GetMajorVersion: JInt;
  2750. begin
  2751. Result := FVersion shr 16;
  2752. end;
  2753.  
  2754. function TJavaVM.GetMinorVersion: JInt;
  2755. begin
  2756. Result := FVersion mod 65536;
  2757. end;
  2758.  
  2759. procedure TJavaVM.SetVersion(const Value: JInt);
  2760. begin
  2761. FVersion := Value;
  2762. FMajorVersion := GetMajorVersion;
  2763. FMinorVersion := GetMinorVersion;
  2764. end;
  2765.  
  2766. procedure TJavaVM.VersionCheck(const FuncName: string; RequiredVersion: JInt);
  2767. begin
  2768. if Version < RequiredVersion then
  2769. raise EJNIUnsupportedMethodError.CreateFmt('Method "%s" not supported in JDK %d.%d', [FuncName, MajorVersion, MinorVersion]);
  2770. end;
  2771.  
  2772. function TJavaVM.DestroyJavaVM: JInt;
  2773. begin
  2774. if FJavaVM <> nil then begin
  2775. Result := FJavaVM^.DestroyJavaVM(FJavaVM);
  2776. if Result = JNI_OK then
  2777. FJavaVM := nil;
  2778. end else
  2779. Result := JNI_OK;
  2780. end;
  2781.  
  2782. function TJavaVM.AttachCurrentThread(Args: PJavaVMAttachArgs): JInt;
  2783. begin
  2784. if FJavaVM = nil then
  2785. raise EJVMError.Create('JavaVM has not been loaded');
  2786. Result := FJavaVM^.AttachCurrentThread(FJavaVM, @FEnv, Args);
  2787. end;
  2788.  
  2789. function TJavaVM.DetachCurrentThread: JInt;
  2790. begin
  2791. if FJavaVM = nil then
  2792. raise EJVMError.Create('JavaVM has not been loaded');
  2793. Result := FJavaVM^.DetachCurrentThread(FJavaVM);
  2794. if Result = JNI_OK then
  2795. FEnv := nil;
  2796. end;
  2797.  
  2798. function TJavaVM.GetEnv(Version: JInt): JInt;
  2799. begin
  2800. if FJavaVM = nil then
  2801. raise EJVMError.Create('JavaVM has not been loaded');
  2802. Result := FJavaVM^.GetEnv(FJavaVM, @FEnv, Version);
  2803. end;
  2804.  
  2805. function TJavaVM.AttachCurrentThreadAsDaemon(Args: PJavaVMAttachArgs): JInt;
  2806. begin
  2807. if FJavaVM = nil then
  2808. raise EJVMError.Create('JavaVM has not been loaded');
  2809. VersionCheck('AttachCurrentThreadAsDaemon', JNI_VERSION_1_4);
  2810. Result := FJavaVM^.AttachCurrentThreadAsDaemon(FJavaVM, @FEnv, Args);
  2811. end;
  2812.  
  2813. {**************************************}
  2814. {**************************************}
  2815. {** Static helper functions **}
  2816. {**************************************}
  2817. {**************************************}
  2818.  
  2819. { Wrap native exception to java.lang.Exception }
  2820. procedure JNI_ThrowException(Env: PJNIEnv; E: Exception);
  2821. var
  2822. jc: JObject;
  2823. begin
  2824. jc := Env^.FindClass(Env, 'java/lang/Exception');
  2825. Env^.ThrowNew(Env, jc, PAnsiChar(AnsiString(E.Message)));
  2826. end;
  2827.  
  2828. { Convert JavaJNIString to WideString }
  2829. { allows conversion without TJNIEnv instance }
  2830. function JNI_JStringToWideString(Env: PJNIEnv; JStr: JString): UnicodeString;
  2831. {var
  2832. Chars: PAnsiChar;
  2833. begin
  2834. if (JStr = nil) then begin
  2835. Result := '';
  2836. Exit;
  2837. end;
  2838.  
  2839. Chars := Env^.GetStringUTFChars(Env, JStr, nil);
  2840. if Chars = nil then
  2841. Result := ''
  2842. else begin
  2843. Result := UTF8Decode(UTF8String(Chars));
  2844. Env^.ReleaseStringUTFChars(Env, JStr, Chars);
  2845. end;
  2846. }
  2847. var
  2848. Chars: PJChar;
  2849. begin
  2850. if (JStr = nil) then begin
  2851. Result := '';
  2852. Exit;
  2853. end;
  2854.  
  2855. Chars := Env^.GetStringChars(Env, JStr, nil);
  2856. if (Chars = nil) then begin
  2857. Result := ''
  2858. end else begin
  2859. SetString(Result, PWideChar(Chars), Env^.GetStringLength(Env, JStr));
  2860. Env^.ReleaseStringChars(Env, JStr, Chars);
  2861. end;
  2862. end;
  2863.  
  2864. { Convert WideString to JavaJNIString }
  2865. { allows conversion without TJNIEnv instance }
  2866. function JNI_WideStringToJString(Env: PJNIEnv; Const WStr: UnicodeString): JString;
  2867. //var
  2868. // sutf8: UTF8String;
  2869. //begin
  2870. // sutf8 := UTF8Encode(WStr);
  2871. // Result := Env^.NewStringUTF(Env, PAnsiChar(sutf8));
  2872. begin
  2873. Result := Env^.NewString(Env, PJChar(PWideChar(WStr)), Length(WStr));
  2874. end;
  2875.  
  2876. function JNI_WideCharToJString(Env: PJNIEnv; Const WStr: PWideChar): JString;
  2877. begin
  2878. Result := JNI_WideStringToJString(Env, WStr);
  2879. end;
  2880.  
  2881. { Convert byte array to JByteArray }
  2882. function JNI_BytesToJByteArray(Env: PJNIEnv; Bytes: TByteDynArray): JByteArray;
  2883. var
  2884. len: Cardinal;
  2885. byteArray: JByteArray;
  2886. begin
  2887. if (bytes = nil) then begin
  2888. Result := nil;
  2889. Exit;
  2890. end;
  2891.  
  2892. len := High(Bytes)+1;
  2893. byteArray := Env^.NewByteArray(Env, Len);
  2894. Env^.SetByteArrayRegion(Env, byteArray, 0, len, @Bytes[0]);
  2895. Result := byteArray;
  2896. end;
  2897.  
  2898. { Convert integer array to JIntArray }
  2899. function JNI_IntegersToJIntArray(Env: PJNIEnv; arr: TIntegerDynArray): JIntArray;
  2900. var
  2901. len: Cardinal;
  2902. intArray: JIntArray;
  2903. begin
  2904. if (arr = nil) then begin
  2905. Result := nil;
  2906. Exit;
  2907. end;
  2908.  
  2909. len := High(arr)+1;
  2910. intArray := Env^.NewIntArray(Env, Len);
  2911. Env^.SetIntArrayRegion(Env, intArray, 0, len, @arr[0]);
  2912. Result := intArray;
  2913. end;
  2914.  
  2915. {**************************************}
  2916. {**************************************}
  2917.  
  2918.  
  2919. {$IFDEF DYNAMIC_LINKING}
  2920. initialization
  2921.  
  2922. finalization
  2923. UnloadJVM;
  2924. {$ENDIF}
  2925.  
  2926. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement