1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
15 * The Original Code is mozilla.org code.
17 * The Initial Developer of the Original Code is
18 * Netscape Communications Corporation.
19 * Portions created by the Initial Developer are Copyright (C) 1998
20 * the Initial Developer. All Rights Reserved.
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
36 * ***** END LICENSE BLOCK ***** */
39 * Proxy JNI implementation.
43 #include "nsISecureJNI2.h"
44 #include "nsHashtable.h"
45 #include "nsVoidArray.h"
48 // Method Signature Processing.
50 static jni_type
get_jni_type(char sig
)
78 static PRBool
get_method_type(const char* sig
, PRUint32
& arg_count
, jni_type
*& arg_types
, jni_type
& return_type
)
84 while (*sig
!= ')' && *sig
) {
85 char arg_sig
= *sig
++;
86 jni_type arg_type
= get_jni_type(arg_sig
);
87 if (arg_type
== jobject_type
) {
88 // could be an array or an object.
89 while (*sig
== '[') ++sig
;
91 // skip over "className;"
93 while (*sig
!= ';') ++sig
;
95 // skip over scalar or ';'.
98 vec
.AppendElement((void*)arg_type
);
100 arg_count
= vec
.Count();
101 arg_types
= new jni_type
[arg_count
];
102 for (int index
= arg_count
- 1; index
>= 0; --index
)
103 arg_types
[index
] = jni_type(vec
.ElementAt(index
));
105 char return_sig
= *++sig
;
106 return_type
= get_jni_type(return_sig
);
112 class JNIHashKey
: public nsHashKey
{
114 JNIHashKey(void* key
) : mKey(key
) {}
116 virtual PRUint32
HashValue(void) const { return PRUint32(mKey
); }
117 virtual PRBool
Equals(const nsHashKey
*aKey
) const { return mKey
== ((JNIHashKey
*)aKey
)->mKey
; }
118 virtual nsHashKey
*Clone(void) const { return new JNIHashKey(mKey
); }
128 JNIMember(const char* name
, const char* sig
);
132 JNIMember::JNIMember(const char* name
, const char* sig
)
133 : mName(NULL
), mSignature(NULL
)
135 mName
= PL_strdup(name
);
136 mSignature
= PL_strdup(sig
);
139 JNIMember::~JNIMember()
142 PL_strfree(mSignature
);
145 struct JNIField
: JNIMember
{
149 JNIField(const char* name
, const char* sig
, jfieldID fieldID
);
152 JNIField::JNIField(const char* name
, const char* sig
, jfieldID fieldID
)
153 : JNIMember(name
, sig
), mFieldID(fieldID
), mFieldType(get_jni_type(*sig
))
157 struct JNIMethod
: JNIMember
{
161 jni_type mReturnType
;
163 JNIMethod(const char* name
, const char* sig
, jmethodID methodID
);
166 jvalue
* marshallArgs(va_list args
);
169 JNIMethod::JNIMethod(const char* name
, const char* sig
, jmethodID methodID
)
170 : JNIMember(name
, sig
), mMethodID(methodID
), mArgCount(0), mArgTypes(NULL
), mReturnType(jvoid_type
)
172 get_method_type(sig
, mArgCount
, mArgTypes
, mReturnType
);
175 JNIMethod::~JNIMethod()
177 if (mArgTypes
!= NULL
)
182 * Copies an argument list into a jvalue array.
184 jvalue
* JNIMethod::marshallArgs(va_list args
)
186 PRUint32 argCount
= mArgCount
;
187 jni_type
* argTypes
= mArgTypes
;
188 jvalue
* jargs
= new jvalue
[argCount
];
190 for (int i
= 0; i
< argCount
; i
++) {
191 switch (argTypes
[i
]) {
193 jargs
[i
].l
= va_arg(args
, jobject
);
196 jargs
[i
].z
= va_arg(args
, jboolean
);
199 jargs
[i
].b
= va_arg(args
, jbyte
);
202 jargs
[i
].b
= va_arg(args
, jbyte
);
205 jargs
[i
].s
= va_arg(args
, jshort
);
208 jargs
[i
].i
= va_arg(args
, jint
);
211 jargs
[i
].j
= va_arg(args
, jlong
);
214 jargs
[i
].f
= va_arg(args
, jfloat
);
217 jargs
[i
].d
= va_arg(args
, jdouble
);
226 * Marshalls a va_list into a jvalue array, and destructor automatically
227 * deletes when the args go out of scope.
229 class MarshalledArgs
{
231 MarshalledArgs(JNIMethod
* forMethod
, va_list args
) : mArgs(forMethod
->marshallArgs(args
)) {}
232 ~MarshalledArgs() { delete[] mArgs
; }
234 operator jvalue
* () { return mArgs
; }
240 class nsJNIEnv
: public JNIEnv
{
242 static JNINativeInterface_ theFuncs
;
243 static nsHashtable
* theIDTable
;
244 nsISecureJNI2
* mSecureEnv
;
245 nsISecurityContext
* mContext
;
248 static nsJNIEnv
& nsJNIEnvRef(JNIEnv
* env
) { return *(nsJNIEnv
*)env
; }
250 nsISecureJNI2
* operator->() { return mSecureEnv
; }
251 nsISecurityContext
* getContext() { return mContext
; }
253 static jint JNICALL
GetVersion(JNIEnv
* env
)
255 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
257 nsresult result
= secureEnv
->GetVersion(&version
);
261 static jclass JNICALL
DefineClass(JNIEnv
*env
, const char *name
, jobject loader
, const jbyte
*buf
, jsize len
)
263 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
264 jclass outClass
= NULL
;
265 nsresult result
= secureEnv
->DefineClass(name
, loader
, buf
, len
, &outClass
);
269 static jclass JNICALL
FindClass(JNIEnv
*env
, const char *name
)
271 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
272 jclass outClass
= NULL
;
273 nsresult result
= secureEnv
->FindClass(name
, &outClass
);
277 static jclass JNICALL
GetSuperclass(JNIEnv
*env
, jclass sub
)
279 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
280 jclass outSuper
= NULL
;
281 nsresult result
= secureEnv
->GetSuperclass(sub
, &outSuper
);
285 static jboolean JNICALL
IsAssignableFrom(JNIEnv
*env
, jclass sub
, jclass sup
)
287 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
288 jboolean outIsAssignable
= FALSE
;
289 nsresult result
= secureEnv
->IsAssignableFrom(sub
, sup
, &outIsAssignable
);
290 return outIsAssignable
;
293 static jint
Throw(JNIEnv
*env
, jthrowable obj
)
295 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
296 jint outStatus
= FALSE
;
297 nsresult result
= secureEnv
->Throw(obj
, &outStatus
);
301 static jint JNICALL
ThrowNew(JNIEnv
*env
, jclass clazz
, const char *msg
)
303 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
304 jint outStatus
= FALSE
;
305 nsresult result
= secureEnv
->ThrowNew(clazz
, msg
, &outStatus
);
309 static jthrowable JNICALL
ExceptionOccurred(JNIEnv
*env
)
311 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
312 jthrowable outThrowable
= NULL
;
313 nsresult result
= secureEnv
->ExceptionOccurred(&outThrowable
);
317 static void JNICALL
ExceptionDescribe(JNIEnv
*env
)
319 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
320 nsresult result
= secureEnv
->ExceptionDescribe();
323 static void JNICALL
ExceptionClear(JNIEnv
*env
)
325 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
326 nsresult result
= secureEnv
->ExceptionClear();
329 static void JNICALL
FatalError(JNIEnv
*env
, const char *msg
)
331 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
332 nsresult result
= secureEnv
->FatalError(msg
);
335 static jobject JNICALL
NewGlobalRef(JNIEnv
*env
, jobject lobj
)
337 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
338 jobject outGlobalRef
= NULL
;
339 nsresult result
= secureEnv
->NewGlobalRef(lobj
, &outGlobalRef
);
343 static void JNICALL
DeleteGlobalRef(JNIEnv
*env
, jobject gref
)
345 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
346 nsresult result
= secureEnv
->DeleteGlobalRef(gref
);
349 static void JNICALL
DeleteLocalRef(JNIEnv
*env
, jobject obj
)
351 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
352 nsresult result
= secureEnv
->DeleteLocalRef(obj
);
355 static jboolean JNICALL
IsSameObject(JNIEnv
*env
, jobject obj1
, jobject obj2
)
357 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
358 jboolean outIsSameObject
= FALSE
;
359 nsresult result
= secureEnv
->IsSameObject(obj1
, obj2
, &outIsSameObject
);
360 return outIsSameObject
;
363 static jobject JNICALL
AllocObject(JNIEnv
*env
, jclass clazz
)
365 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
366 jobject outObject
= NULL
;
367 nsresult result
= secureEnv
->AllocObject(clazz
, &outObject
);
371 static jobject JNICALL
NewObject(JNIEnv
*env
, jclass clazz
, jmethodID methodID
, ...)
373 va_list args
; va_start(args
, methodID
);
374 jobject outObject
= NewObjectV(env
, clazz
, methodID
, args
);
379 static jobject JNICALL
NewObjectV(JNIEnv
*env
, jclass clazz
, jmethodID methodID
, va_list args
)
381 jobject outObject
= NULL
;
383 // convert the va_list into an array of jvalues.
384 JNIMethod
* method
= (JNIMethod
*)methodID
;
385 MarshalledArgs
jargs(method
, args
);
386 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
387 nsresult result
= secureEnv
->NewObject(clazz
, method
->mMethodID
, jargs
, &outObject
, secureEnv
.getContext());
392 static jobject JNICALL
NewObjectA(JNIEnv
*env
, jclass clazz
, jmethodID methodID
, jvalue
*args
)
394 jobject outObject
= NULL
;
395 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
396 JNIMethod
* method
= (JNIMethod
*)methodID
;
397 nsresult result
= secureEnv
->NewObject(clazz
, method
->mMethodID
, args
, &outObject
, secureEnv
.getContext());
401 static jclass JNICALL
GetObjectClass(JNIEnv
*env
, jobject obj
)
403 jclass outClass
= NULL
;
404 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
405 nsresult result
= secureEnv
->GetObjectClass(obj
, &outClass
);
409 static jboolean JNICALL
IsInstanceOf(JNIEnv
*env
, jobject obj
, jclass clazz
)
411 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
412 jboolean outIsInstanceOf
= FALSE
;
413 nsresult result
= secureEnv
->IsInstanceOf(obj
, clazz
, &outIsInstanceOf
);
414 return outIsInstanceOf
;
417 static jmethodID JNICALL
GetMethodID(JNIEnv
*env
, jclass clazz
, const char *name
, const char *sig
)
419 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
420 jmethodID outMethodID
= NULL
;
421 nsresult result
= secureEnv
->GetMethodID(clazz
, name
, sig
, &outMethodID
);
422 if (result
== NS_OK
) {
423 JNIHashKey
key(outMethodID
);
424 JNIMethod
* method
= (JNIMethod
*) theIDTable
->Get(&key
);
425 if (method
== NULL
) {
426 method
= new JNIMethod(name
, sig
, outMethodID
);
427 theIDTable
->Put(&key
, method
);
429 outMethodID
= jmethodID(method
);
435 * Bottleneck methods called by method families below.
440 static jvalue
InvokeMethod(JNIEnv
*env
, jobject obj
, JNIMethod
* method
, jvalue
* args
)
442 jvalue outValue
= { NULL
};
443 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
444 nsresult result
= secureEnv
->CallMethod(method
->mReturnType
, obj
, method
->mMethodID
, args
, &outValue
, secureEnv
.getContext());
448 static jvalue
InvokeMethod(JNIEnv
*env
, jobject obj
, JNIMethod
* method
, va_list args
)
450 // convert the va_list into an array of jvalues.
451 MarshalledArgs
jargs(method
, args
);
452 return InvokeMethod(env
, obj
, method
, jargs
);
455 static void InvokeVoidMethod(JNIEnv
*env
, jobject obj
, JNIMethod
* method
, jvalue
* args
)
458 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
459 nsresult result
= secureEnv
->CallMethod(jvoid_type
, obj
, method
->mMethodID
, args
, &unusedValue
, secureEnv
.getContext());
462 static void InvokeVoidMethod(JNIEnv
*env
, jobject obj
, JNIMethod
* method
, va_list args
)
464 // convert the va_list into an array of jvalues.
465 MarshalledArgs
jargs(method
, args
);
466 InvokeVoidMethod(env
, obj
, method
, jargs
);
469 #define IMPLEMENT_METHOD_FAMILY(methodName, returnType, jvalueField) \
470 static returnType JNICALL methodName(JNIEnv *env, jobject obj, jmethodID methodID, ...) \
472 va_list args; va_start(args, methodID); \
473 returnType result = InvokeMethod(env, obj, (JNIMethod*)methodID, args).jvalueField; \
478 static returnType JNICALL methodName##V(JNIEnv *env, jobject obj, jmethodID methodID, va_list args) \
480 return InvokeMethod(env, obj, (JNIMethod*)methodID, args).jvalueField; \
483 static returnType JNICALL methodName##A(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args) \
485 return InvokeMethod(env, obj, (JNIMethod*)methodID, args).jvalueField; \
488 // Pattern on which IMPLEMENT_METHOD_FAMILY is based.
490 static jobject JNICALL CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
492 va_list args; va_start(args, methodID);
493 jobject outObject = InvokeMethod(env, obj, (JNIMethod*)methodID, args).l;
498 static jobject JNICALL CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
500 return InvokeMethod(env, obj, (JNIMethod*)methodID, args).l;
503 static jobject JNICALL CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
505 return InvokeMethod(env, obj, (JNIMethod*)methodID, args).l;
509 IMPLEMENT_METHOD_FAMILY(CallObjectMethod
, jobject
, l
)
510 IMPLEMENT_METHOD_FAMILY(CallBooleanMethod
, jboolean
, z
)
511 IMPLEMENT_METHOD_FAMILY(CallByteMethod
, jbyte
, b
)
512 IMPLEMENT_METHOD_FAMILY(CallCharMethod
, jchar
, c
)
513 IMPLEMENT_METHOD_FAMILY(CallShortMethod
, jshort
, s
)
514 IMPLEMENT_METHOD_FAMILY(CallIntMethod
, jint
, i
)
515 IMPLEMENT_METHOD_FAMILY(CallLongMethod
, jlong
, j
)
516 IMPLEMENT_METHOD_FAMILY(CallFloatMethod
, jfloat
, f
)
517 IMPLEMENT_METHOD_FAMILY(CallDoubleMethod
, jdouble
, d
)
519 #undef IMPLEMENT_METHOD_FAMILY
521 static void JNICALL
CallVoidMethod(JNIEnv
*env
, jobject obj
, jmethodID methodID
, ...)
523 va_list args
; va_start(args
, methodID
);
524 InvokeVoidMethod(env
, obj
, (JNIMethod
*)methodID
, args
);
528 static void JNICALL
CallVoidMethodV(JNIEnv
*env
, jobject obj
, jmethodID methodID
, va_list args
)
530 InvokeVoidMethod(env
, obj
, (JNIMethod
*)methodID
, args
);
533 static void JNICALL
CallVoidMethodA(JNIEnv
*env
, jobject obj
, jmethodID methodID
, jvalue
* args
)
535 InvokeVoidMethod(env
, obj
, (JNIMethod
*)methodID
, args
);
538 // Non-virtual Invokers.
540 static jvalue
InvokeNonVirtualMethod(JNIEnv
*env
, jobject obj
, jclass clazz
, JNIMethod
* method
, jvalue
* args
)
542 jvalue outValue
= { NULL
};
543 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
544 nsresult result
= secureEnv
->CallNonvirtualMethod(method
->mReturnType
, obj
, clazz
, method
->mMethodID
, args
, &outValue
, secureEnv
.getContext());
548 static jvalue
InvokeNonVirtualMethod(JNIEnv
*env
, jobject obj
, jclass clazz
, JNIMethod
* method
, va_list args
)
550 // convert the va_list into an array of jvalues.
551 MarshalledArgs
jargs(method
, args
);
552 return InvokeNonVirtualMethod(env
, obj
, clazz
, method
, jargs
);
555 static void InvokeNonVirtualVoidMethod(JNIEnv
*env
, jobject obj
, jclass clazz
, JNIMethod
* method
, jvalue
* args
)
558 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
559 nsresult result
= secureEnv
->CallNonvirtualMethod(jvoid_type
, obj
, clazz
, method
->mMethodID
, args
, &unusedValue
, secureEnv
.getContext());
562 static void InvokeNonVirtualVoidMethod(JNIEnv
*env
, jobject obj
, jclass clazz
, JNIMethod
* method
, va_list args
)
564 // convert the va_list into an array of jvalues.
565 MarshalledArgs
jargs(method
, args
);
566 InvokeNonVirtualVoidMethod(env
, obj
, clazz
, method
, jargs
);
569 #define IMPLEMENT_METHOD_FAMILY(methodName, returnType, jvalueField) \
570 static returnType JNICALL methodName(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...) \
572 va_list args; va_start(args, methodID); \
573 returnType result = InvokeNonVirtualMethod(env, obj, clazz, (JNIMethod*)methodID, args).jvalueField; \
578 static returnType JNICALL methodName##V(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args) \
580 return InvokeNonVirtualMethod(env, obj, clazz, (JNIMethod*)methodID, args).jvalueField; \
583 static returnType JNICALL methodName##A(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args) \
585 return InvokeNonVirtualMethod(env, obj, clazz, (JNIMethod*)methodID, args).jvalueField; \
588 IMPLEMENT_METHOD_FAMILY(CallNonvirtualObjectMethod, jobject, l)
589 IMPLEMENT_METHOD_FAMILY(CallNonvirtualBooleanMethod
, jboolean
, z
)
590 IMPLEMENT_METHOD_FAMILY(CallNonvirtualByteMethod
, jbyte
, b
)
591 IMPLEMENT_METHOD_FAMILY(CallNonvirtualCharMethod
, jchar
, c
)
592 IMPLEMENT_METHOD_FAMILY(CallNonvirtualShortMethod
, jshort
, s
)
593 IMPLEMENT_METHOD_FAMILY(CallNonvirtualIntMethod
, jint
, i
)
594 IMPLEMENT_METHOD_FAMILY(CallNonvirtualLongMethod
, jlong
, j
)
595 IMPLEMENT_METHOD_FAMILY(CallNonvirtualFloatMethod
, jfloat
, f
)
596 IMPLEMENT_METHOD_FAMILY(CallNonvirtualDoubleMethod
, jdouble
, d
)
598 #undef IMPLEMENT_METHOD_FAMILY
600 static void JNICALL
CallNonvirtualVoidMethod(JNIEnv
*env
, jobject obj
, jclass clazz
, jmethodID methodID
, ...)
602 va_list args
; va_start(args
, methodID
);
603 InvokeNonVirtualVoidMethod(env
, obj
, clazz
, (JNIMethod
*)methodID
, args
);
607 static void JNICALL
CallNonvirtualVoidMethodV(JNIEnv
*env
, jobject obj
, jclass clazz
, jmethodID methodID
, va_list args
)
609 InvokeNonVirtualVoidMethod(env
, obj
, clazz
, (JNIMethod
*)methodID
, args
);
612 static void JNICALL
CallNonvirtualVoidMethodA(JNIEnv
*env
, jobject obj
, jclass clazz
, jmethodID methodID
, jvalue
* args
)
614 InvokeNonVirtualVoidMethod(env
, obj
, clazz
, (JNIMethod
*)methodID
, args
);
619 static jfieldID JNICALL
GetFieldID(JNIEnv
*env
, jclass clazz
, const char *name
, const char *sig
)
621 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
622 jfieldID outFieldID
= NULL
;
623 nsresult result
= secureEnv
->GetFieldID(clazz
, name
, sig
, &outFieldID
);
624 if (result
== NS_OK
) {
625 JNIHashKey
key(outFieldID
);
626 JNIField
* field
= (JNIField
*) theIDTable
->Get(&key
);
628 field
= new JNIField(name
, sig
, outFieldID
);
629 theIDTable
->Put(&key
, field
);
631 outFieldID
= jfieldID(field
);
636 static jvalue
GetField(JNIEnv
* env
, jobject obj
, JNIField
* field
)
638 jvalue outValue
= { NULL
};
639 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
640 nsresult result
= secureEnv
->GetField(field
->mFieldType
, obj
, field
->mFieldID
, &outValue
, secureEnv
.getContext());
644 #define IMPLEMENT_GET_FIELD(methodName, returnType, jvalueField) \
645 static returnType JNICALL methodName(JNIEnv *env, jobject obj, jfieldID fieldID) \
647 return GetField(env, obj, (JNIField*)fieldID).jvalueField; \
650 IMPLEMENT_GET_FIELD(GetObjectField, jobject, l)
651 IMPLEMENT_GET_FIELD(GetBooleanField
, jboolean
, z
)
652 IMPLEMENT_GET_FIELD(GetByteField
, jbyte
, b
)
653 IMPLEMENT_GET_FIELD(GetCharField
, jchar
, c
)
654 IMPLEMENT_GET_FIELD(GetShortField
, jshort
, s
)
655 IMPLEMENT_GET_FIELD(GetIntField
, jint
, i
)
656 IMPLEMENT_GET_FIELD(GetLongField
, jlong
, j
)
657 IMPLEMENT_GET_FIELD(GetFloatField
, jfloat
, f
)
658 IMPLEMENT_GET_FIELD(GetDoubleField
, jdouble
, d
)
660 #undef IMPLEMENT_GET_FIELD
662 static void SetField(JNIEnv
* env
, jobject obj
, JNIField
* field
, jvalue value
)
664 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
665 nsresult result
= secureEnv
->SetField(field
->mFieldType
, obj
, field
->mFieldID
, value
, secureEnv
.getContext());
668 #define IMPLEMENT_SET_FIELD(methodName, fieldType, jvalueField) \
669 static void JNICALL methodName(JNIEnv *env, jobject obj, jfieldID fieldID, fieldType value) \
672 fieldValue.jvalueField = value; \
673 SetField(env, obj, (JNIField*)fieldID, fieldValue); \
676 IMPLEMENT_SET_FIELD(SetObjectField, jobject, l)
677 IMPLEMENT_SET_FIELD(SetBooleanField
, jboolean
, z
)
678 IMPLEMENT_SET_FIELD(SetByteField
, jbyte
, b
)
679 IMPLEMENT_SET_FIELD(SetCharField
, jchar
, c
)
680 IMPLEMENT_SET_FIELD(SetShortField
, jshort
, s
)
681 IMPLEMENT_SET_FIELD(SetIntField
, jint
, i
)
682 IMPLEMENT_SET_FIELD(SetLongField
, jlong
, j
)
683 IMPLEMENT_SET_FIELD(SetFloatField
, jfloat
, f
)
684 IMPLEMENT_SET_FIELD(SetDoubleField
, jdouble
, d
)
686 #undef IMPLEMENT_SET_FIELD
690 static jmethodID JNICALL
GetStaticMethodID(JNIEnv
*env
, jclass clazz
, const char *name
, const char *sig
)
692 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
693 jmethodID outMethodID
= NULL
;
694 nsresult result
= secureEnv
->GetStaticMethodID(clazz
, name
, sig
, &outMethodID
);
695 if (result
== NS_OK
) {
696 JNIHashKey
key(outMethodID
);
697 JNIMethod
* method
= (JNIMethod
*) theIDTable
->Get(&key
);
698 if (method
== NULL
) {
699 method
= new JNIMethod(name
, sig
, outMethodID
);
700 theIDTable
->Put(&key
, method
);
702 outMethodID
= jmethodID(method
);
707 // jobject (JNICALL *CallStaticObjectMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
711 static jvalue
InvokeStaticMethod(JNIEnv
*env
, jclass clazz
, JNIMethod
* method
, jvalue
* args
)
713 jvalue outValue
= { NULL
};
714 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
715 nsresult result
= secureEnv
->CallStaticMethod(method
->mReturnType
, clazz
, method
->mMethodID
, args
, &outValue
, secureEnv
.getContext());
719 static jvalue
InvokeStaticMethod(JNIEnv
*env
, jclass clazz
, JNIMethod
* method
, va_list args
)
721 // convert the va_list into an array of jvalues.
722 MarshalledArgs
jargs(method
, args
);
723 return InvokeStaticMethod(env
, clazz
, method
, jargs
);
726 static void InvokeStaticVoidMethod(JNIEnv
*env
, jclass clazz
, JNIMethod
* method
, jvalue
* args
)
729 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
730 nsresult result
= secureEnv
->CallStaticMethod(jvoid_type
, clazz
, method
->mMethodID
, args
, &unusedValue
, secureEnv
.getContext());
733 static void InvokeStaticVoidMethod(JNIEnv
*env
, jclass clazz
, JNIMethod
* method
, va_list args
)
735 // convert the va_list into an array of jvalues.
736 MarshalledArgs
jargs(method
, args
);
737 InvokeStaticVoidMethod(env
, clazz
, method
, jargs
);
740 #define IMPLEMENT_METHOD_FAMILY(methodName, returnType, jvalueField) \
741 static returnType JNICALL methodName(JNIEnv *env, jclass clazz, jmethodID methodID, ...) \
743 va_list args; va_start(args, methodID); \
744 returnType result = InvokeStaticMethod(env, clazz, (JNIMethod*)methodID, args).jvalueField; \
749 static returnType JNICALL methodName##V(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args) \
751 return InvokeStaticMethod(env, clazz, (JNIMethod*)methodID, args).jvalueField; \
754 static returnType JNICALL methodName##A(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue * args) \
756 return InvokeStaticMethod(env, clazz, (JNIMethod*)methodID, args).jvalueField; \
759 IMPLEMENT_METHOD_FAMILY(CallStaticObjectMethod, jobject, l)
760 IMPLEMENT_METHOD_FAMILY(CallStaticBooleanMethod
, jboolean
, z
)
761 IMPLEMENT_METHOD_FAMILY(CallStaticByteMethod
, jbyte
, b
)
762 IMPLEMENT_METHOD_FAMILY(CallStaticCharMethod
, jchar
, c
)
763 IMPLEMENT_METHOD_FAMILY(CallStaticShortMethod
, jshort
, s
)
764 IMPLEMENT_METHOD_FAMILY(CallStaticIntMethod
, jint
, i
)
765 IMPLEMENT_METHOD_FAMILY(CallStaticLongMethod
, jlong
, j
)
766 IMPLEMENT_METHOD_FAMILY(CallStaticFloatMethod
, jfloat
, f
)
767 IMPLEMENT_METHOD_FAMILY(CallStaticDoubleMethod
, jdouble
, d
)
769 #undef IMPLEMENT_METHOD_FAMILY
771 static void JNICALL
CallStaticVoidMethod(JNIEnv
*env
, jclass clazz
, jmethodID methodID
, ...)
773 va_list args
; va_start(args
, methodID
);
774 InvokeStaticVoidMethod(env
, clazz
, (JNIMethod
*)methodID
, args
);
778 static void JNICALL
CallStaticVoidMethodV(JNIEnv
*env
, jclass clazz
, jmethodID methodID
, va_list args
)
780 InvokeStaticVoidMethod(env
, clazz
, (JNIMethod
*)methodID
, args
);
783 static void JNICALL
CallStaticVoidMethodA(JNIEnv
*env
, jclass clazz
, jmethodID methodID
, jvalue
* args
)
785 InvokeStaticVoidMethod(env
, clazz
, (JNIMethod
*)methodID
, args
);
790 static jfieldID JNICALL
GetStaticFieldID(JNIEnv
*env
, jclass clazz
, const char *name
, const char *sig
)
792 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
793 jfieldID outFieldID
= NULL
;
794 nsresult result
= secureEnv
->GetStaticFieldID(clazz
, name
, sig
, &outFieldID
);
795 if (result
== NS_OK
) {
796 JNIHashKey
key(outFieldID
);
797 JNIField
* field
= (JNIField
*) theIDTable
->Get(&key
);
799 field
= new JNIField(name
, sig
, outFieldID
);
800 theIDTable
->Put(&key
, field
);
802 outFieldID
= jfieldID(field
);
807 static jvalue
GetStaticField(JNIEnv
* env
, jclass clazz
, JNIField
* field
)
809 jvalue outValue
= { NULL
};
810 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
811 nsresult result
= secureEnv
->GetStaticField(field
->mFieldType
, clazz
, field
->mFieldID
, &outValue
, secureEnv
.getContext());
815 #define IMPLEMENT_GET_FIELD(methodName, returnType, jvalueField) \
816 static returnType JNICALL methodName(JNIEnv *env, jclass clazz, jfieldID fieldID) \
818 return GetStaticField(env, clazz, (JNIField*)fieldID).jvalueField; \
821 IMPLEMENT_GET_FIELD(GetStaticObjectField, jobject, l)
822 IMPLEMENT_GET_FIELD(GetStaticBooleanField
, jboolean
, z
)
823 IMPLEMENT_GET_FIELD(GetStaticByteField
, jbyte
, b
)
824 IMPLEMENT_GET_FIELD(GetStaticCharField
, jchar
, c
)
825 IMPLEMENT_GET_FIELD(GetStaticShortField
, jshort
, s
)
826 IMPLEMENT_GET_FIELD(GetStaticIntField
, jint
, i
)
827 IMPLEMENT_GET_FIELD(GetStaticLongField
, jlong
, j
)
828 IMPLEMENT_GET_FIELD(GetStaticFloatField
, jfloat
, f
)
829 IMPLEMENT_GET_FIELD(GetStaticDoubleField
, jdouble
, d
)
831 #undef IMPLEMENT_GET_FIELD
833 static void SetStaticField(JNIEnv
* env
, jclass clazz
, JNIField
* field
, jvalue value
)
835 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
836 nsresult result
= secureEnv
->SetStaticField(field
->mFieldType
, clazz
, field
->mFieldID
, value
, secureEnv
.getContext());
839 #define IMPLEMENT_SET_FIELD(methodName, fieldType, jvalueField) \
840 static void JNICALL methodName(JNIEnv *env, jclass clazz, jfieldID fieldID, fieldType value) \
843 fieldValue.jvalueField = value; \
844 SetStaticField(env, clazz, (JNIField*)fieldID, fieldValue); \
847 IMPLEMENT_SET_FIELD(SetStaticObjectField, jobject, l)
848 IMPLEMENT_SET_FIELD(SetStaticBooleanField
, jboolean
, z
)
849 IMPLEMENT_SET_FIELD(SetStaticByteField
, jbyte
, b
)
850 IMPLEMENT_SET_FIELD(SetStaticCharField
, jchar
, c
)
851 IMPLEMENT_SET_FIELD(SetStaticShortField
, jshort
, s
)
852 IMPLEMENT_SET_FIELD(SetStaticIntField
, jint
, i
)
853 IMPLEMENT_SET_FIELD(SetStaticLongField
, jlong
, j
)
854 IMPLEMENT_SET_FIELD(SetStaticFloatField
, jfloat
, f
)
855 IMPLEMENT_SET_FIELD(SetStaticDoubleField
, jdouble
, d
)
857 #undef IMPLEMENT_SET_FIELD
859 static jstring JNICALL
NewString(JNIEnv
*env
, const jchar
*unicode
, jsize len
)
862 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
863 nsresult result
= secureEnv
->NewString(unicode
, len
, &outString
);
867 static jsize JNICALL
GetStringLength(JNIEnv
*env
, jstring str
)
870 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
871 nsresult result
= secureEnv
->GetStringLength(str
, &outLength
);
875 static const jchar
* JNICALL
GetStringChars(JNIEnv
*env
, jstring str
, jboolean
*isCopy
)
877 jchar
* outChars
= NULL
;
878 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
879 nsresult result
= secureEnv
->GetStringChars(str
, isCopy
, &outChars
);
883 static void JNICALL
ReleaseStringChars(JNIEnv
*env
, jstring str
, const jchar
*chars
)
885 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
886 nsresult result
= secureEnv
->ReleaseStringChars(str
, chars
);
889 static jstring JNICALL
NewStringUTF(JNIEnv
*env
, const char *utf
)
892 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
893 nsresult result
= secureEnv
->NewStringUTF(utf
, &outString
);
897 static jsize JNICALL
GetStringUTFLength(JNIEnv
*env
, jstring str
)
900 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
901 nsresult result
= secureEnv
->GetStringUTFLength(str
, &outLength
);
905 static const char* JNICALL
GetStringUTFChars(JNIEnv
*env
, jstring str
, jboolean
*isCopy
)
907 const char* outChars
= NULL
;
908 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
909 nsresult result
= secureEnv
->GetStringUTFChars(str
, isCopy
, &outChars
);
913 static void JNICALL
ReleaseStringUTFChars(JNIEnv
*env
, jstring str
, const char* chars
)
915 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
916 nsresult result
= secureEnv
->ReleaseStringUTFChars(str
, chars
);
919 static jsize JNICALL
GetArrayLength(JNIEnv
*env
, jarray array
)
922 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
923 nsresult result
= secureEnv
->GetArrayLength(array
, &outLength
);
927 static jobjectArray JNICALL
NewObjectArray(JNIEnv
*env
, jsize len
, jclass clazz
, jobject initVal
)
929 jobjectArray outArray
= NULL
;
930 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
931 nsresult result
= secureEnv
->NewObjectArray(len
, clazz
, initVal
, &outArray
);
935 static jobject JNICALL
GetObjectArrayElement(JNIEnv
*env
, jobjectArray array
, jsize index
)
937 jobject outObject
= NULL
;
938 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
939 nsresult result
= secureEnv
->GetObjectArrayElement(array
, index
, &outObject
);
943 static void JNICALL
SetObjectArrayElement(JNIEnv
*env
, jobjectArray array
, jsize index
, jobject val
)
945 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
946 nsresult result
= secureEnv
->SetObjectArrayElement(array
, index
, val
);
949 #define IMPLEMENT_NEW_ARRAY(methodName, type) \
950 static type##Array JNICALL methodName(JNIEnv *env, jsize len) \
952 type##Array outArray = NULL; \
953 nsJNIEnv& secureEnv = nsJNIEnvRef(env); \
954 nsresult result = secureEnv->NewArray(type##_type, len, (jarray*)&outArray); \
958 IMPLEMENT_NEW_ARRAY(NewBooleanArray, jboolean)
959 IMPLEMENT_NEW_ARRAY(NewByteArray
, jbyte
)
960 IMPLEMENT_NEW_ARRAY(NewCharArray
, jchar
)
961 IMPLEMENT_NEW_ARRAY(NewShortArray
, jshort
)
962 IMPLEMENT_NEW_ARRAY(NewIntArray
, jint
)
963 IMPLEMENT_NEW_ARRAY(NewLongArray
, jlong
)
964 IMPLEMENT_NEW_ARRAY(NewFloatArray
, jfloat
)
965 IMPLEMENT_NEW_ARRAY(NewDoubleArray
, jdouble
)
967 #undef IMPLEMENT_NEW_ARRAY
969 #define IMPLEMENT_GET_ARRAY_ELEMENTS(methodName, type) \
970 static type* JNICALL methodName(JNIEnv *env, type##Array array, jboolean *isCopy) \
972 type* outElements = NULL; \
973 nsJNIEnv& secureEnv = nsJNIEnvRef(env); \
974 nsresult result = secureEnv->GetArrayElements(type##_type, array, isCopy, &outElements); \
975 return outElements; \
978 IMPLEMENT_GET_ARRAY_ELEMENTS(GetBooleanArrayElements, jboolean)
979 IMPLEMENT_GET_ARRAY_ELEMENTS(GetByteArrayElements
, jbyte
)
980 IMPLEMENT_GET_ARRAY_ELEMENTS(GetCharArrayElements
, jchar
)
981 IMPLEMENT_GET_ARRAY_ELEMENTS(GetShortArrayElements
, jshort
)
982 IMPLEMENT_GET_ARRAY_ELEMENTS(GetIntArrayElements
, jint
)
983 IMPLEMENT_GET_ARRAY_ELEMENTS(GetLongArrayElements
, jlong
)
984 IMPLEMENT_GET_ARRAY_ELEMENTS(GetFloatArrayElements
, jfloat
)
985 IMPLEMENT_GET_ARRAY_ELEMENTS(GetDoubleArrayElements
, jdouble
)
987 #undef IMPLEMENT_GET_ARRAY_ELEMENTS
989 #define IMPLEMENT_RELEASE_ARRAY_ELEMENTS(methodName, type) \
990 static void JNICALL methodName(JNIEnv *env, type##Array array, type* elems, jint mode) \
992 nsJNIEnv& secureEnv = nsJNIEnvRef(env); \
993 nsresult result = secureEnv->ReleaseArrayElements(type##_type, array, elems, mode); \
996 IMPLEMENT_RELEASE_ARRAY_ELEMENTS(ReleaseBooleanArrayElements, jboolean)
997 IMPLEMENT_RELEASE_ARRAY_ELEMENTS(ReleaseByteArrayElements
, jbyte
)
998 IMPLEMENT_RELEASE_ARRAY_ELEMENTS(ReleaseCharArrayElements
, jchar
)
999 IMPLEMENT_RELEASE_ARRAY_ELEMENTS(ReleaseShortArrayElements
, jshort
)
1000 IMPLEMENT_RELEASE_ARRAY_ELEMENTS(ReleaseIntArrayElements
, jint
)
1001 IMPLEMENT_RELEASE_ARRAY_ELEMENTS(ReleaseLongArrayElements
, jlong
)
1002 IMPLEMENT_RELEASE_ARRAY_ELEMENTS(ReleaseFloatArrayElements
, jfloat
)
1003 IMPLEMENT_RELEASE_ARRAY_ELEMENTS(ReleaseDoubleArrayElements
, jdouble
)
1005 #undef IMPLEMENT_RELEASE_ARRAY_ELEMENTS
1007 #define IMPLEMENT_GET_ARRAY_REGION(methodName, type) \
1008 static void JNICALL methodName(JNIEnv *env, type##Array array, jsize start, jsize len, type* buf) \
1010 nsJNIEnv& secureEnv = nsJNIEnvRef(env); \
1011 nsresult result = secureEnv->GetArrayRegion(type##_type, array, start, len, buf); \
1014 IMPLEMENT_GET_ARRAY_REGION(GetBooleanArrayRegion, jboolean)
1015 IMPLEMENT_GET_ARRAY_REGION(GetByteArrayRegion
, jbyte
)
1016 IMPLEMENT_GET_ARRAY_REGION(GetCharArrayRegion
, jchar
)
1017 IMPLEMENT_GET_ARRAY_REGION(GetShortArrayRegion
, jshort
)
1018 IMPLEMENT_GET_ARRAY_REGION(GetIntArrayRegion
, jint
)
1019 IMPLEMENT_GET_ARRAY_REGION(GetLongArrayRegion
, jlong
)
1020 IMPLEMENT_GET_ARRAY_REGION(GetFloatArrayRegion
, jfloat
)
1021 IMPLEMENT_GET_ARRAY_REGION(GetDoubleArrayRegion
, jdouble
)
1023 #undef IMPLEMENT_GET_ARRAY_REGION
1025 #define IMPLEMENT_SET_ARRAY_REGION(methodName, type) \
1026 static void JNICALL methodName(JNIEnv *env, type##Array array, jsize start, jsize len, type* buf) \
1028 nsJNIEnv& secureEnv = nsJNIEnvRef(env); \
1029 nsresult result = secureEnv->SetArrayRegion(type##_type, array, start, len, buf); \
1032 IMPLEMENT_SET_ARRAY_REGION(SetBooleanArrayRegion, jboolean)
1033 IMPLEMENT_SET_ARRAY_REGION(SetByteArrayRegion
, jbyte
)
1034 IMPLEMENT_SET_ARRAY_REGION(SetCharArrayRegion
, jchar
)
1035 IMPLEMENT_SET_ARRAY_REGION(SetShortArrayRegion
, jshort
)
1036 IMPLEMENT_SET_ARRAY_REGION(SetIntArrayRegion
, jint
)
1037 IMPLEMENT_SET_ARRAY_REGION(SetLongArrayRegion
, jlong
)
1038 IMPLEMENT_SET_ARRAY_REGION(SetFloatArrayRegion
, jfloat
)
1039 IMPLEMENT_SET_ARRAY_REGION(SetDoubleArrayRegion
, jdouble
)
1041 #undef IMPLEMENT_SET_ARRAY_REGION
1043 static jint JNICALL
RegisterNatives(JNIEnv
*env
, jclass clazz
, const JNINativeMethod
*methods
, jint nMethods
)
1046 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
1047 nsresult result
= secureEnv
->RegisterNatives(clazz
, methods
, nMethods
, &outStatus
);
1051 static jint JNICALL
UnregisterNatives(JNIEnv
*env
, jclass clazz
)
1054 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
1055 nsresult result
= secureEnv
->UnregisterNatives(clazz
, &outStatus
);
1059 static jint JNICALL
MonitorEnter(JNIEnv
*env
, jobject obj
)
1062 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
1063 nsresult result
= secureEnv
->MonitorEnter(obj
, &outStatus
);
1067 static jint JNICALL JNICALL
MonitorExit(JNIEnv
*env
, jobject obj
)
1070 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
1071 nsresult result
= secureEnv
->MonitorExit(obj
, &outStatus
);
1075 static jint JNICALL
GetJavaVM(JNIEnv
*env
, JavaVM
**vm
)
1078 nsJNIEnv
& secureEnv
= nsJNIEnvRef(env
);
1079 nsresult result
= secureEnv
->GetJavaVM(vm
, &outStatus
);
1084 nsJNIEnv(nsISecureJNI2
* secureEnv
);
1088 JNINativeInterface_
nsJNIEnv::theFuncs
= {
1089 NULL
, // void *reserved0;
1090 NULL
, // void *reserved1;
1091 NULL
, // void *reserved2;
1093 NULL
, // void *reserved3;
1095 // jint (JNICALL *GetVersion)(JNIEnv *env);
1098 // jclass (JNICALL *DefineClass) (JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len);
1101 // jclass (JNICALL *FindClass) (JNIEnv *env, const char *name);
1104 NULL
, // void *reserved4;
1105 NULL
, // void *reserved5;
1106 NULL
, // void *reserved6;
1108 // jclass (JNICALL *GetSuperclass) (JNIEnv *env, jclass sub);
1111 // jboolean (JNICALL *IsAssignableFrom) (JNIEnv *env, jclass sub, jclass sup);
1114 NULL
, // void *reserved7;
1116 // jint (JNICALL *Throw) (JNIEnv *env, jthrowable obj);
1119 // jint (JNICALL *ThrowNew) (JNIEnv *env, jclass clazz, const char *msg);
1122 // jthrowable (JNICALL *ExceptionOccurred) (JNIEnv *env);
1125 // void (JNICALL *ExceptionDescribe) (JNIEnv *env);
1128 // void (JNICALL *ExceptionClear) (JNIEnv *env);
1131 // void (JNICALL *FatalError) (JNIEnv *env, const char *msg);
1134 NULL
, // void *reserved8;
1135 NULL
, // void *reserved9;
1137 // jobject (JNICALL *NewGlobalRef) (JNIEnv *env, jobject lobj);
1140 // void (JNICALL *DeleteGlobalRef) (JNIEnv *env, jobject gref);
1143 // void (JNICALL *DeleteLocalRef) (JNIEnv *env, jobject obj);
1146 // jboolean (JNICALL *IsSameObject) (JNIEnv *env, jobject obj1, jobject obj2);
1149 NULL
, // void *reserved10;
1150 NULL
, // void *reserved11;
1152 // jobject (JNICALL *AllocObject) (JNIEnv *env, jclass clazz);
1155 #define REFERENCE_METHOD_FAMILY(methodName) &methodName, &methodName##V, &methodName##A,
1157 // jobject (JNICALL *NewObject) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
1158 // jobject (JNICALL *NewObjectV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
1159 // jobject (JNICALL *NewObjectA) (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
1160 REFERENCE_METHOD_FAMILY(NewObject
)
1162 // jclass (JNICALL *GetObjectClass) (JNIEnv *env, jobject obj);
1165 // jboolean (JNICALL *IsInstanceOf) (JNIEnv *env, jobject obj, jclass clazz);
1168 // jmethodID (JNICALL *GetMethodID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
1171 // jobject (JNICALL *CallObjectMethod) (JNIEnv *env, jobject obj, jmethodID methodID, ...);
1172 // jobject (JNICALL *CallObjectMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
1173 // jobject (JNICALL *CallObjectMethodA) (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args);
1174 REFERENCE_METHOD_FAMILY(CallObjectMethod
)
1176 // jboolean (JNICALL *CallBooleanMethod) (JNIEnv *env, jobject obj, jmethodID methodID, ...);
1177 // jboolean (JNICALL *CallBooleanMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
1178 // jboolean (JNICALL *CallBooleanMethodA) (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args);
1179 REFERENCE_METHOD_FAMILY(CallBooleanMethod
)
1181 // jbyte (JNICALL *CallByteMethod) (JNIEnv *env, jobject obj, jmethodID methodID, ...);
1182 // jbyte (JNICALL *CallByteMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
1183 // jbyte (JNICALL *CallByteMethodA) (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
1184 REFERENCE_METHOD_FAMILY(CallByteMethod
)
1186 // jchar (JNICALL *CallCharMethod) (JNIEnv *env, jobject obj, jmethodID methodID, ...);
1187 // jchar (JNICALL *CallCharMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
1188 // jchar (JNICALL *CallCharMethodA) (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
1189 REFERENCE_METHOD_FAMILY(CallCharMethod
)
1191 // jshort (JNICALL *CallShortMethod) (JNIEnv *env, jobject obj, jmethodID methodID, ...);
1192 // jshort (JNICALL *CallShortMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
1193 // jshort (JNICALL *CallShortMethodA) (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
1194 REFERENCE_METHOD_FAMILY(CallShortMethod
)
1196 // jint (JNICALL *CallIntMethod) (JNIEnv *env, jobject obj, jmethodID methodID, ...);
1197 // jint (JNICALL *CallIntMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
1198 // jint (JNICALL *CallIntMethodA) (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
1199 REFERENCE_METHOD_FAMILY(CallIntMethod
)
1201 // jlong (JNICALL *CallLongMethod) (JNIEnv *env, jobject obj, jmethodID methodID, ...);
1202 // jlong (JNICALL *CallLongMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
1203 // jlong (JNICALL *CallLongMethodA) (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
1204 REFERENCE_METHOD_FAMILY(CallLongMethod
)
1206 // jfloat (JNICALL *CallFloatMethod) (JNIEnv *env, jobject obj, jmethodID methodID, ...);
1207 // jfloat (JNICALL *CallFloatMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
1208 // jfloat (JNICALL *CallFloatMethodA) (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
1209 REFERENCE_METHOD_FAMILY(CallFloatMethod
)
1211 // jdouble (JNICALL *CallDoubleMethod) (JNIEnv *env, jobject obj, jmethodID methodID, ...);
1212 // jdouble (JNICALL *CallDoubleMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
1213 // jdouble (JNICALL *CallDoubleMethodA) (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
1214 REFERENCE_METHOD_FAMILY(CallDoubleMethod
)
1216 // void (JNICALL *CallVoidMethod) (JNIEnv *env, jobject obj, jmethodID methodID, ...);
1217 // void (JNICALL *CallVoidMethodV) (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
1218 // void (JNICALL *CallVoidMethodA) (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args);
1219 REFERENCE_METHOD_FAMILY(CallVoidMethod
)
1221 // jobject (JNICALL *CallNonvirtualObjectMethod) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
1222 // jobject (JNICALL *CallNonvirtualObjectMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
1223 // jobject (JNICALL *CallNonvirtualObjectMethodA) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
1224 REFERENCE_METHOD_FAMILY(CallNonvirtualObjectMethod
)
1226 // jboolean (JNICALL *CallNonvirtualBooleanMethod) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
1227 // jboolean (JNICALL *CallNonvirtualBooleanMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
1228 // jboolean (JNICALL *CallNonvirtualBooleanMethodA) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
1229 REFERENCE_METHOD_FAMILY(CallNonvirtualBooleanMethod
)
1231 // jbyte (JNICALL *CallNonvirtualByteMethod) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
1232 // jbyte (JNICALL *CallNonvirtualByteMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
1233 // jbyte (JNICALL *CallNonvirtualByteMethodA) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
1234 REFERENCE_METHOD_FAMILY(CallNonvirtualByteMethod
)
1236 // jchar (JNICALL *CallNonvirtualCharMethod) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
1237 // jchar (JNICALL *CallNonvirtualCharMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
1238 // jchar (JNICALL *CallNonvirtualCharMethodA) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
1239 REFERENCE_METHOD_FAMILY(CallNonvirtualCharMethod
)
1241 // jshort (JNICALL *CallNonvirtualShortMethod) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
1242 // jshort (JNICALL *CallNonvirtualShortMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
1243 // jshort (JNICALL *CallNonvirtualShortMethodA) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
1244 REFERENCE_METHOD_FAMILY(CallNonvirtualShortMethod
)
1246 // jint (JNICALL *CallNonvirtualIntMethod) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
1247 // jint (JNICALL *CallNonvirtualIntMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
1248 // jint (JNICALL *CallNonvirtualIntMethodA) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
1249 REFERENCE_METHOD_FAMILY(CallNonvirtualIntMethod
)
1251 // jlong (JNICALL *CallNonvirtualLongMethod) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
1252 // jlong (JNICALL *CallNonvirtualLongMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
1253 // jlong (JNICALL *CallNonvirtualLongMethodA) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
1254 REFERENCE_METHOD_FAMILY(CallNonvirtualLongMethod
)
1256 // jfloat (JNICALL *CallNonvirtualFloatMethod) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
1257 // jfloat (JNICALL *CallNonvirtualFloatMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
1258 // jfloat (JNICALL *CallNonvirtualFloatMethodA) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
1259 REFERENCE_METHOD_FAMILY(CallNonvirtualFloatMethod
)
1261 // jdouble (JNICALL *CallNonvirtualDoubleMethod) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
1262 // jdouble (JNICALL *CallNonvirtualDoubleMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
1263 // jdouble (JNICALL *CallNonvirtualDoubleMethodA) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
1264 REFERENCE_METHOD_FAMILY(CallNonvirtualDoubleMethod
)
1266 // void (JNICALL *CallNonvirtualVoidMethod) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
1267 // void (JNICALL *CallNonvirtualVoidMethodV) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
1268 // void (JNICALL *CallNonvirtualVoidMethodA) (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
1269 REFERENCE_METHOD_FAMILY(CallNonvirtualVoidMethod
)
1271 // jfieldID (JNICALL *GetFieldID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
1274 // jobject (JNICALL *GetObjectField) (JNIEnv *env, jobject obj, jfieldID fieldID);
1275 // jboolean (JNICALL *GetBooleanField) (JNIEnv *env, jobject obj, jfieldID fieldID);
1276 // jbyte (JNICALL *GetByteField) (JNIEnv *env, jobject obj, jfieldID fieldID);
1277 // jchar (JNICALL *GetCharField) (JNIEnv *env, jobject obj, jfieldID fieldID);
1278 // jshort (JNICALL *GetShortField) (JNIEnv *env, jobject obj, jfieldID fieldID);
1279 // jint (JNICALL *GetIntField) (JNIEnv *env, jobject obj, jfieldID fieldID);
1280 // jlong (JNICALL *GetLongField) (JNIEnv *env, jobject obj, jfieldID fieldID);
1281 // jfloat (JNICALL *GetFloatField) (JNIEnv *env, jobject obj, jfieldID fieldID);
1282 // jdouble (JNICALL *GetDoubleField) (JNIEnv *env, jobject obj, jfieldID fieldID);
1283 &GetObjectField
, &GetBooleanField
, &GetByteField
, &GetCharField
, &GetShortField
, &GetIntField
, &GetLongField
,
1284 &GetFloatField
, &GetDoubleField
,
1286 // void (JNICALL *SetObjectField) (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
1287 // void (JNICALL *SetBooleanField) (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
1288 // void (JNICALL *SetByteField) (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
1289 // void (JNICALL *SetCharField) (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
1290 // void (JNICALL *SetShortField) (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
1291 // void (JNICALL *SetIntField) (JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
1292 // void (JNICALL *SetLongField) (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
1293 // void (JNICALL *SetFloatField) (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
1294 // void (JNICALL *SetDoubleField) (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
1295 &SetObjectField
, &SetBooleanField
, &SetByteField
, &SetCharField
, &SetShortField
, &SetIntField
, &SetLongField
,
1296 &SetFloatField
, &SetDoubleField
,
1298 // jmethodID (JNICALL *GetStaticMethodID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
1301 // jobject (JNICALL *CallStaticObjectMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
1302 // jobject (JNICALL *CallStaticObjectMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
1303 // jobject (JNICALL *CallStaticObjectMethodA) (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
1304 REFERENCE_METHOD_FAMILY(CallStaticObjectMethod
)
1306 // jboolean (JNICALL *CallStaticBooleanMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
1307 // jboolean (JNICALL *CallStaticBooleanMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
1308 // jboolean (JNICALL *CallStaticBooleanMethodA) (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
1309 REFERENCE_METHOD_FAMILY(CallStaticBooleanMethod
)
1311 // jbyte (JNICALL *CallStaticByteMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
1312 // jbyte (JNICALL *CallStaticByteMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
1313 // jbyte (JNICALL *CallStaticByteMethodA) (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
1314 REFERENCE_METHOD_FAMILY(CallStaticByteMethod
)
1316 // jchar (JNICALL *CallStaticCharMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
1317 // jchar (JNICALL *CallStaticCharMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
1318 // jchar (JNICALL *CallStaticCharMethodA) (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
1319 REFERENCE_METHOD_FAMILY(CallStaticCharMethod
)
1321 // jshort (JNICALL *CallStaticShortMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
1322 // jshort (JNICALL *CallStaticShortMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
1323 // jshort (JNICALL *CallStaticShortMethodA) (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
1324 REFERENCE_METHOD_FAMILY(CallStaticShortMethod
)
1326 // jint (JNICALL *CallStaticIntMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
1327 // jint (JNICALL *CallStaticIntMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
1328 // jint (JNICALL *CallStaticIntMethodA) (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
1329 REFERENCE_METHOD_FAMILY(CallStaticIntMethod
)
1331 // jlong (JNICALL *CallStaticLongMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
1332 // jlong (JNICALL *CallStaticLongMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
1333 // jlong (JNICALL *CallStaticLongMethodA) (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
1334 REFERENCE_METHOD_FAMILY(CallStaticLongMethod
)
1336 // jfloat (JNICALL *CallStaticFloatMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
1337 // jfloat (JNICALL *CallStaticFloatMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
1338 // jfloat (JNICALL *CallStaticFloatMethodA) (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
1339 REFERENCE_METHOD_FAMILY(CallStaticFloatMethod
)
1341 // jdouble (JNICALL *CallStaticDoubleMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
1342 // jdouble (JNICALL *CallStaticDoubleMethodV) (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
1343 // jdouble (JNICALL *CallStaticDoubleMethodA) (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
1344 REFERENCE_METHOD_FAMILY(CallStaticDoubleMethod
)
1346 // void (JNICALL *CallStaticVoidMethod) (JNIEnv *env, jclass cls, jmethodID methodID, ...);
1347 // void (JNICALL *CallStaticVoidMethodV) (JNIEnv *env, jclass cls, jmethodID methodID, va_list args);
1348 // void (JNICALL *CallStaticVoidMethodA) (JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args);
1349 REFERENCE_METHOD_FAMILY(CallStaticVoidMethod
)
1351 // jfieldID (JNICALL *GetStaticFieldID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
1354 // jobject (JNICALL *GetStaticObjectField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
1355 // jboolean (JNICALL *GetStaticBooleanField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
1356 // jbyte (JNICALL *GetStaticByteField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
1357 // jchar (JNICALL *GetStaticCharField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
1358 // jshort (JNICALL *GetStaticShortField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
1359 // jint (JNICALL *GetStaticIntField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
1360 // jlong (JNICALL *GetStaticLongField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
1361 // jfloat (JNICALL *GetStaticFloatField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
1362 // jdouble (JNICALL *GetStaticDoubleField) (JNIEnv *env, jclass clazz, jfieldID fieldID);
1363 &GetStaticObjectField
, &GetStaticBooleanField
, &GetStaticByteField
, &GetStaticCharField
, &GetStaticShortField
,
1364 &GetStaticIntField
, &GetStaticLongField
, &GetStaticFloatField
, &GetStaticDoubleField
,
1366 // void (JNICALL *SetStaticObjectField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value);
1367 // void (JNICALL *SetStaticBooleanField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value);
1368 // void (JNICALL *SetStaticByteField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value);
1369 // void (JNICALL *SetStaticCharField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value);
1370 // void (JNICALL *SetStaticShortField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value);
1371 // void (JNICALL *SetStaticIntField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value);
1372 // void (JNICALL *SetStaticLongField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value);
1373 // void (JNICALL *SetStaticFloatField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value);
1374 // void (JNICALL *SetStaticDoubleField) (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value);
1375 &SetStaticObjectField
, &SetStaticBooleanField
, &SetStaticByteField
, &SetStaticCharField
, &SetStaticShortField
,
1376 &SetStaticIntField
, &SetStaticLongField
, &SetStaticFloatField
, &SetStaticDoubleField
,
1378 // jstring (JNICALL *NewString) (JNIEnv *env, const jchar *unicode, jsize len);
1379 // jsize (JNICALL *GetStringLength) (JNIEnv *env, jstring str);
1380 // const jchar *(JNICALL *GetStringChars) (JNIEnv *env, jstring str, jboolean *isCopy);
1381 // void (JNICALL *ReleaseStringChars) (JNIEnv *env, jstring str, const jchar *chars);
1382 &NewString
, &GetStringLength
, &GetStringChars
, &ReleaseStringChars
,
1384 // jstring (JNICALL *NewStringUTF) (JNIEnv *env, const char *utf);
1385 // jsize (JNICALL *GetStringUTFLength) (JNIEnv *env, jstring str);
1386 // const char* (JNICALL *GetStringUTFChars) (JNIEnv *env, jstring str, jboolean *isCopy);
1387 // void (JNICALL *ReleaseStringUTFChars) (JNIEnv *env, jstring str, const char* chars);
1388 &NewStringUTF
, &GetStringUTFLength
, &GetStringUTFChars
, &ReleaseStringUTFChars
,
1390 // jsize (JNICALL *GetArrayLength) (JNIEnv *env, jarray array);
1393 // jobjectArray (JNICALL *NewObjectArray) (JNIEnv *env, jsize len, jclass clazz, jobject init);
1394 // jobject (JNICALL *GetObjectArrayElement) (JNIEnv *env, jobjectArray array, jsize index);
1395 // void (JNICALL *SetObjectArrayElement) (JNIEnv *env, jobjectArray array, jsize index, jobject val);
1396 &NewObjectArray
, &GetObjectArrayElement
, &SetObjectArrayElement
,
1398 // jbooleanArray (JNICALL *NewBooleanArray) (JNIEnv *env, jsize len);
1399 // jbyteArray (JNICALL *NewByteArray) (JNIEnv *env, jsize len);
1400 // jcharArray (JNICALL *NewCharArray) (JNIEnv *env, jsize len);
1401 // jshortArray (JNICALL *NewShortArray) (JNIEnv *env, jsize len);
1402 // jintArray (JNICALL *NewIntArray) (JNIEnv *env, jsize len);
1403 // jlongArray (JNICALL *NewLongArray) (JNIEnv *env, jsize len);
1404 // jfloatArray (JNICALL *NewFloatArray) (JNIEnv *env, jsize len);
1405 // jdoubleArray (JNICALL *NewDoubleArray) (JNIEnv *env, jsize len);
1406 &NewBooleanArray
, &NewByteArray
, &NewCharArray
, &NewShortArray
,
1407 &NewIntArray
, &NewLongArray
, &NewFloatArray
, &NewDoubleArray
,
1409 // jboolean * (JNICALL *GetBooleanArrayElements) (JNIEnv *env, jbooleanArray array, jboolean *isCopy);
1410 // jbyte * (JNICALL *GetByteArrayElements) (JNIEnv *env, jbyteArray array, jboolean *isCopy);
1411 // jchar * (JNICALL *GetCharArrayElements) (JNIEnv *env, jcharArray array, jboolean *isCopy);
1412 // jshort * (JNICALL *GetShortArrayElements) (JNIEnv *env, jshortArray array, jboolean *isCopy);
1413 // jint * (JNICALL *GetIntArrayElements) (JNIEnv *env, jintArray array, jboolean *isCopy);
1414 // jlong * (JNICALL *GetLongArrayElements) (JNIEnv *env, jlongArray array, jboolean *isCopy);
1415 // jfloat * (JNICALL *GetFloatArrayElements) (JNIEnv *env, jfloatArray array, jboolean *isCopy);
1416 // jdouble * (JNICALL *GetDoubleArrayElements) (JNIEnv *env, jdoubleArray array, jboolean *isCopy);
1417 &GetBooleanArrayElements
, &GetByteArrayElements
, &GetCharArrayElements
, &GetShortArrayElements
,
1418 &GetIntArrayElements
, &GetLongArrayElements
, &GetFloatArrayElements
, &GetDoubleArrayElements
,
1420 // void (JNICALL *ReleaseBooleanArrayElements)(JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode);
1421 // void (JNICALL *ReleaseByteArrayElements) (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode);
1422 // void (JNICALL *ReleaseCharArrayElements) (JNIEnv *env, jcharArray array, jchar *elems, jint mode);
1423 // void (JNICALL *ReleaseShortArrayElements) (JNIEnv *env, jshortArray array, jshort *elems, jint mode);
1424 // void (JNICALL *ReleaseIntArrayElements) (JNIEnv *env, jintArray array, jint *elems, jint mode);
1425 // void (JNICALL *ReleaseLongArrayElements) (JNIEnv *env, jlongArray array, jlong *elems, jint mode);
1426 // void (JNICALL *ReleaseFloatArrayElements) (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode);
1427 // void (JNICALL *ReleaseDoubleArrayElements) (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode);
1428 &ReleaseBooleanArrayElements
, &ReleaseByteArrayElements
, &ReleaseCharArrayElements
, &ReleaseShortArrayElements
,
1429 &ReleaseIntArrayElements
, &ReleaseLongArrayElements
, &ReleaseFloatArrayElements
, &ReleaseDoubleArrayElements
,
1431 // void (JNICALL *GetBooleanArrayRegion) (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf);
1432 // void (JNICALL *GetByteArrayRegion) (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);
1433 // void (JNICALL *GetCharArrayRegion) (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);
1434 // void (JNICALL *GetShortArrayRegion) (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);
1435 // void (JNICALL *GetIntArrayRegion) (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);
1436 // void (JNICALL *GetLongArrayRegion) (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);
1437 // void (JNICALL *GetFloatArrayRegion) (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);
1438 // void (JNICALL *GetDoubleArrayRegion) (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);
1439 &GetBooleanArrayRegion
, &GetByteArrayRegion
, &GetCharArrayRegion
, &GetShortArrayRegion
,
1440 &GetIntArrayRegion
, &GetLongArrayRegion
, &GetFloatArrayRegion
, &GetDoubleArrayRegion
,
1442 // void (JNICALL *SetBooleanArrayRegion) (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf);
1443 // void (JNICALL *SetByteArrayRegion) (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);
1444 // void (JNICALL *SetCharArrayRegion) (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);
1445 // void (JNICALL *SetShortArrayRegion) (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);
1446 // void (JNICALL *SetIntArrayRegion) (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);
1447 // void (JNICALL *SetLongArrayRegion) (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);
1448 // void (JNICALL *SetFloatArrayRegion) (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);
1449 // void (JNICALL *SetDoubleArrayRegion) (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);
1450 &SetBooleanArrayRegion
, &SetByteArrayRegion
, &SetCharArrayRegion
, &SetShortArrayRegion
,
1451 &SetIntArrayRegion
, &SetLongArrayRegion
, &SetFloatArrayRegion
, &SetDoubleArrayRegion
,
1453 // jint (JNICALL *RegisterNatives) (JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods);
1454 // jint (JNICALL *UnregisterNatives) (JNIEnv *env, jclass clazz);
1455 &RegisterNatives
, &UnregisterNatives
,
1457 // jint (JNICALL *MonitorEnter) (JNIEnv *env, jobject obj);
1458 // jint (JNICALL *MonitorExit) (JNIEnv *env, jobject obj);
1459 &MonitorEnter
, &MonitorExit
,
1461 // jint (JNICALL *GetJavaVM) (JNIEnv *env, JavaVM **vm);
1465 nsHashtable
* nsJNIEnv::theIDTable
= NULL
;
1467 nsJNIEnv::nsJNIEnv(nsISecureJNI2
* secureEnv
)
1468 : mSecureEnv(secureEnv
), mContext(NULL
), mJavaThread(NULL
)
1470 this->functions
= &theFuncs
;
1471 if (theIDTable
== NULL
)
1472 theIDTable
= new nsHashtable();
1475 nsJNIEnv::~nsJNIEnv()
1477 this->functions
= NULL
;