56 internal const string METHOD_PTR_FIELD_PREFIX =
"__<jniptr>";
58 internal const int JNI_OK = 0;
59 internal const int JNI_ERR = -1;
60 internal const int JNI_EDETACHED = -2;
61 internal const int JNI_EVERSION = -3;
62 internal const int JNI_COMMIT = 1;
63 internal const int JNI_ABORT = 2;
64 internal const int JNI_VERSION_1_1 = 0x00010001;
65 internal const int JNI_VERSION_1_2 = 0x00010002;
66 internal const int JNI_VERSION_1_4 = 0x00010004;
67 internal const int JNI_VERSION_1_6 = 0x00010006;
68 internal const int JNI_VERSION_1_8 = 0x00010008;
69 internal const int JNIInvalidRefType = 0;
70 internal const int JNILocalRefType = 1;
71 internal const int JNIGlobalRefType = 2;
72 internal const int JNIWeakGlobalRefType = 3;
73 internal const jboolean JNI_TRUE = 1;
74 internal const jboolean JNI_FALSE = 0;
76 static readonly MUTF8Encoding
MUTF8 = MUTF8Encoding.GetMUTF8(52);
78 internal void* vtable;
79 internal GCHandle context;
80 internal GCHandle* pinHandles;
81 internal int pinHandleMaxCount;
82 internal int pinHandleInUseCount;
88 internal JNIEnvContext GetContext()
90 return (JNIEnvContext)context.Target;
100 var env = JNIEnvContext.Current =
new JNIEnvContext(context);
101 var jniEnvPtr = env.pJNIEnv;
103 jniEnvPtr->context = GCHandle.Alloc(env, GCHandleType.WeakTrackResurrection);
104 jniEnvPtr->pinHandles =
null;
105 jniEnvPtr->pinHandleMaxCount = 0;
106 jniEnvPtr->pinHandleInUseCount = 0;
113 internal static void FreeJNIEnv()
115 JNIEnvContext.Current =
null;
125 internal static string DecodeMUTF8Argument(
byte* psz,
string arg)
132 throw new java.
lang.IllegalArgumentException(arg);
134 var v =
MUTF8.GetString(psz, l);
144 internal static string DecodeMUTF8(
byte* psz)
151 throw new java.
lang.IllegalArgumentException();
153 var v =
MUTF8.GetString(psz, l);
164 internal static int GetMethodArgs(
JNIEnv* pEnv, nint methodID,
byte* sig)
167 for (var i = 0; i < args.Length; i++)
168 sig[i] = args[i].IsPrimitive ? (
byte)args[i].SigName[0] : (byte)
'L';
173 internal static int GetVersion(
JNIEnv* pEnv)
175 return JNI_VERSION_1_8;
178 internal static nint DefineClass(
JNIEnv* pEnv,
byte* name, nint loader,
jbyte* pbuf,
jint length)
182 var buf =
new byte[length];
183 Marshal.Copy((nint)(
void*)pbuf, buf, 0, length);
186 var classLoader = (
java.
lang.ClassLoader)pEnv->UnwrapRef(loader);
191 JVM.SetPendingException(e);
198 var env = pEnv->GetContext();
199 if (env.callerID !=
null)
201 else if (env.classLoader !=
null)
202 return env.classLoader;
207 internal static nint FindClass(
JNIEnv* pEnv,
byte* name)
213 var n = DecodeMUTF8Argument(name, nameof(name));
217 throw new java.
lang.NoClassDefFoundError(n);
220 if (n.StartsWith(
"L") && n.EndsWith(
";"))
221 n = n.Substring(1, n.Length - 2);
225 throw new java.
lang.NoClassDefFoundError(n);
229 return pEnv->MakeLocalRef(w.ClassObject);
233 ExceptionDispatchInfo.Capture(e.ToJava()).Throw();
239 JVM.SetPendingException(e);
244 internal static nint FromReflectedMethod(
JNIEnv* pEnv, nint method)
252 JVM.SetPendingException(e);
257 internal static nint FromReflectedField(
JNIEnv* pEnv, nint field)
265 JVM.SetPendingException(e);
270 internal static nint ToReflectedMethod(
JNIEnv* pEnv, nint clazz_ignored, nint method, sbyte isStatic)
274 return pEnv->MakeLocalRef(
RuntimeJavaMethod.FromCookie(method).ToMethodOrConstructor(
true));
278 JVM.SetPendingException(e);
283 internal static nint GetSuperclass(
JNIEnv* pEnv, nint sub)
287 var wrapper = RuntimeJavaType.FromClass((
java.
lang.Class)pEnv->UnwrapRef(sub)).BaseTypeWrapper;
288 return pEnv->MakeLocalRef(wrapper ==
null ?
null : wrapper.ClassObject);
292 JVM.SetPendingException(e);
297 internal static sbyte IsAssignableFrom(
JNIEnv* pEnv, nint sub, nint super)
301 var w1 = RuntimeJavaType.FromClass((
java.
lang.Class)pEnv->UnwrapRef(sub));
302 var w2 = RuntimeJavaType.FromClass((
java.
lang.Class)pEnv->UnwrapRef(super));
303 return w1.IsAssignableTo(w2) ? JNI_TRUE : JNI_FALSE;
307 JVM.SetPendingException(e);
312 internal static nint ToReflectedField(
JNIEnv* pEnv, nint clazz_ignored, nint field,
jboolean isStatic)
316 return pEnv->MakeLocalRef(
RuntimeJavaField.FromCookie(field).ToField(
true));
320 JVM.SetPendingException(e);
329 var env = pEnv->GetContext();
330 var e = UnwrapRef(env, throwable) as Exception;
332 JVM.SetPendingException(e);
338 JVM.SetPendingException(e);
343 internal static jint ThrowNew(
JNIEnv* pEnv, nint clazz,
byte* msg)
347 var env = pEnv->GetContext();
348 var wrapper = RuntimeJavaType.FromClass((
java.
lang.Class)UnwrapRef(env, clazz));
349 var mw = wrapper.GetMethod(
"<init>", msg ==
null ?
"()V" :
"(Ljava.lang.String;)V",
false);
355 var cons = (
java.
lang.reflect.Constructor)mw.ToMethodOrConstructor(
false);
356 JVM.SetPendingException((Exception)cons.newInstance(msg ==
null ?
new object[0] :
new object[] { DecodeMUTF8Argument(msg, nameof(msg)) }, env.callerID));
361 ExceptionDispatchInfo.Capture(x.ToJava()).Throw();
367 throw new java.
lang.NoSuchMethodError(
"<init>(Ljava.lang.String;)V");
372 JVM.SetPendingException(e);
382 internal static nint ExceptionOccurred(
JNIEnv* pEnv)
386 return pEnv->MakeLocalRef(
JVM.GetPendingException());
390 JVM.SetPendingException(e);
399 internal static void ExceptionDescribe(
JNIEnv* pEnv)
403 var x =
JVM.GetPendingException();
406 JVM.SetPendingException(
null);
410 ikvm.extensions.ExtensionMethods.printStackTrace(x);
414 Debug.Assert(
false, ex.ToString());
420 JVM.SetPendingException(e);
428 internal static void ExceptionClear(
JNIEnv* pEnv)
432 JVM.SetPendingException(
null);
436 JVM.SetPendingException(e);
445 internal static void FatalError(
JNIEnv* pEnv,
byte* msg)
447 Console.Error.WriteLine(
"FATAL ERROR in native method: {0}", msg ==
null ?
"(null)" : DecodeMUTF8Argument(msg, nameof(msg)));
448 Console.Error.WriteLine(
new StackTrace(1,
true));
449 System.Environment.Exit(1);
462 return pEnv->GetContext().PushLocalFrame(capacity);
466 JVM.SetPendingException(e);
477 internal static nint PopLocalFrame(
JNIEnv* pEnv, nint result)
481 var env = pEnv->GetContext();
482 return env.PopLocalFrame(UnwrapRef(env, result));
486 JVM.SetPendingException(e);
497 internal static nint NewGlobalRef(
JNIEnv* pEnv, nint obj)
501 var o = pEnv->UnwrapRef(obj);
506 JVM.SetPendingException(e);
516 internal static void DeleteGlobalRef(
JNIEnv* pEnv, nint obj)
527 Debug.Assert(
false,
"Local ref passed to DeleteGlobalRef");
531 JVM.SetPendingException(e);
540 internal static void DeleteLocalRef(
JNIEnv* pEnv, nint obj)
544 pEnv->GetContext().DeleteLocalRef(obj);
548 JVM.SetPendingException(e);
559 internal static jboolean IsSameObject(
JNIEnv* pEnv, nint obj1, nint obj2)
563 return pEnv->UnwrapRef(obj1) == pEnv->UnwrapRef(obj2) ? JNI_TRUE : JNI_FALSE;
567 JVM.SetPendingException(e);
578 internal static nint NewLocalRef(
JNIEnv* pEnv, nint obj)
582 return pEnv->MakeLocalRef(pEnv->UnwrapRef(obj));
586 JVM.SetPendingException(e);
597 internal static jint EnsureLocalCapacity(
JNIEnv* pEnv,
jint capacity)
609 internal static nint AllocObject(
JNIEnv* pEnv, nint clazz)
617 JVM.SetPendingException(e);
626 if (wrapper.IsAbstract)
627 throw new java.
lang.InstantiationException(wrapper.Name);
631 return pEnv->MakeLocalRef(FormatterServices.GetUninitializedObject(wrapper.TypeAsBaseType));
633 return pEnv->MakeLocalRef(RuntimeHelpers.GetUninitializedObject(wrapper.TypeAsBaseType));
638 ExceptionDispatchInfo.Capture(e.ToJava()).Throw();
655 var env = pEnv->GetContext();
656 var obj = UnwrapRef(env, objHandle);
664 var argTypes = mw.GetParameters();
665 var args =
new object[argTypes.Length + (mw.HasCallerID ? 1 : 0)];
666 for (
int i = 0; i < argTypes.Length; i++)
668 var type = argTypes[i];
669 if (type == env.context.PrimitiveJavaTypeFactory.BOOLEAN)
670 args[i] = pArgs[i].
z != JNI_FALSE;
671 else if (type == env.context.PrimitiveJavaTypeFactory.BYTE)
672 args[i] = (byte)pArgs[i].b;
673 else if (type == env.context.PrimitiveJavaTypeFactory.CHAR)
674 args[i] = (char)pArgs[i].c;
675 else if (type == env.context.PrimitiveJavaTypeFactory.SHORT)
676 args[i] = pArgs[i].
s;
677 else if (type == env.context.PrimitiveJavaTypeFactory.INT)
678 args[i] = pArgs[i].
i;
679 else if (type == env.context.PrimitiveJavaTypeFactory.LONG)
680 args[i] = pArgs[i].
j;
681 else if (type == env.context.PrimitiveJavaTypeFactory.FLOAT)
682 args[i] = pArgs[i].
f;
683 else if (type == env.context.PrimitiveJavaTypeFactory.DOUBLE)
684 args[i] = pArgs[i].
d;
686 args[i] = argTypes[i].GhostWrap(UnwrapRef(env, pArgs[i].l));
691 args[args.Length - 1] = env.callerID;
693 if (nonVirtual && mw.RequiresNonVirtualDispatcher)
696 if (mw.IsConstructor)
700 return mw.CreateInstance(args);
704 var mb = mw.GetMethod();
710 throw new NotSupportedException($
"Remapped type {mw.DeclaringType.Name} doesn't support constructor invocation on an existing instance");
712 else if (!mb.DeclaringType.IsInstanceOfType(obj))
715 throw new NotSupportedException($
"Unable to partially construct object of type {obj.GetType().FullName} to type {mb.DeclaringType.FullName}");
720 return mw.Invoke(obj, args);
734 if (mw.HasCallerID || mw.IsDynamicOnly)
735 throw new NotSupportedException();
737 if (mw.DeclaringType.IsRemapped && !mw.DeclaringType.TypeAsBaseType.IsInstanceOfType(obj))
738 return mw.InvokeNonvirtualRemapped(obj, argarray);
740 var del = (Delegate)Activator.CreateInstance(mw.GetDelegateType(),
new object[] { obj, mw.GetMethod().MethodHandle.GetFunctionPointer() });
743 return del.DynamicInvoke(argarray);
745 catch (TargetInvocationException e)
747 ExceptionDispatchInfo.Capture(ikvm.runtime.Util.mapException(e.InnerException)).Throw();
756 var wrapper = RuntimeJavaType.FromClass((
java.
lang.Class)pEnv->UnwrapRef(clazz));
757 if (wrapper.IsAbstract ==
false && wrapper.TypeAsBaseType.IsAbstract)
758 return pEnv->MakeLocalRef(
InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false));
761 if (obj != IntPtr.Zero)
765 if (ExceptionCheck(pEnv) == JNI_TRUE)
767 DeleteLocalRef(pEnv, obj);
776 JVM.SetPendingException(e);
781 internal static nint GetObjectClass(
JNIEnv* pEnv, nint obj)
789 JVM.SetPendingException(e);
794 internal static jboolean IsInstanceOf(
JNIEnv* pEnv, nint obj, nint clazz)
801 var w1 = RuntimeJavaType.FromClass((
java.
lang.Class)pEnv->UnwrapRef(clazz));
802 var w2 = RuntimeJavaType.FromClass(objClass);
803 return w2.IsAssignableTo(w1) ? JNI_TRUE : JNI_FALSE;
807 JVM.SetPendingException(e);
816 var mw = tw.GetMethod(name, sig,
true);
817 if (mw ==
null || !mw.IsHideFromReflection)
820 tw = mw.DeclaringType.BaseTypeWrapper;
828 foreach (var iface
in add)
829 if (list.Contains(iface) ==
false)
835 var list =
new List<RuntimeJavaType>();
838 if (tw.BaseTypeWrapper !=
null)
842 foreach (RuntimeJavaType iface
in tw.Interfaces)
855 var mw = iface.GetMethod(name, sig,
false);
856 if (mw !=
null && !mw.IsHideFromReflection)
867 var tw = RuntimeJavaType.FromClass((
java.
lang.Class)pEnv->UnwrapRef(clazz));
871 var methodname = (IntPtr)name == IntPtr.Zero ?
"<init>" : DecodeMUTF8Argument(name, nameof(name));
872 var methodsig = DecodeMUTF8Argument(sig, nameof(sig));
877 if (methodsig.IndexOf(
'.') < 0)
879 methodsig = methodsig.Replace(
'/',
'.');
880 if (methodname ==
"<init>" || methodname ==
"<clinit>")
881 mw = tw.GetMethod(methodname, methodsig,
false);
885 if (mw !=
null && mw.IsStatic == isStatic)
891 throw new java.
lang.NoSuchMethodError($
"{methodname}{methodsig}");
895 ExceptionDispatchInfo.Capture(e.ToJava()).Throw();
900 internal static nint GetMethodID(
JNIEnv* pEnv, nint clazz,
byte* name,
byte* sig)
908 JVM.SetPendingException(e);
913 internal static nint CallObjectMethodA(
JNIEnv* pEnv, nint obj, nint methodID,
JValue* args)
917 return pEnv->MakeLocalRef(
InvokeHelper(pEnv, obj, methodID, args,
false));
921 JVM.SetPendingException(e);
926 internal static jboolean CallBooleanMethodA(
JNIEnv* pEnv, nint obj, nint methodID,
JValue* args)
932 return ((
bool)o) ? JNI_TRUE : JNI_FALSE;
938 JVM.SetPendingException(e);
943 internal static jbyte CallByteMethodA(
JNIEnv* pEnv, nint obj, nint methodID,
JValue* args)
949 return (
jbyte)(byte)o;
955 JVM.SetPendingException(e);
960 internal static jchar CallCharMethodA(
JNIEnv* pEnv, nint obj, nint methodID,
JValue* args)
966 return (
jchar)(char)o;
972 JVM.SetPendingException(e);
977 internal static jshort CallShortMethodA(
JNIEnv* pEnv, nint obj, nint methodID,
JValue* args)
989 JVM.SetPendingException(e);
994 internal static jint CallIntMethodA(
JNIEnv* pEnv, nint obj, nint methodID,
JValue* args)
1000 return (
jint)(int)o;
1006 JVM.SetPendingException(e);
1011 internal static jlong CallLongMethodA(
JNIEnv* pEnv, nint obj, nint methodID,
JValue* args)
1015 var o =
InvokeHelper(pEnv, obj, methodID, args,
false);
1017 return (
jlong)(long)o;
1023 JVM.SetPendingException(e);
1028 internal static jfloat CallFloatMethodA(
JNIEnv* pEnv, nint obj, nint methodID,
JValue* args)
1032 var o =
InvokeHelper(pEnv, obj, methodID, args,
false);
1040 JVM.SetPendingException(e);
1045 internal static jdouble CallDoubleMethodA(
JNIEnv* pEnv, nint obj, nint methodID,
JValue* args)
1049 var o =
InvokeHelper(pEnv, obj, methodID, args,
false);
1057 JVM.SetPendingException(e);
1062 internal static void CallVoidMethodA(
JNIEnv* pEnv, nint obj, nint methodID,
JValue* args)
1070 JVM.SetPendingException(e);
1074 internal static nint CallNonvirtualObjectMethodA(
JNIEnv* pEnv, nint obj, nint clazz, nint methodID,
JValue* args)
1078 return pEnv->MakeLocalRef(
InvokeHelper(pEnv, obj, methodID, args,
true));
1082 JVM.SetPendingException(e);
1087 internal static jboolean CallNonvirtualBooleanMethodA(
JNIEnv* pEnv, nint obj, nint clazz, nint methodID,
JValue* args)
1093 return ((
bool)o) ? JNI_TRUE : JNI_FALSE;
1099 JVM.SetPendingException(e);
1104 internal static jbyte CallNonvirtualByteMethodA(
JNIEnv* pEnv, nint obj, nint clazz, nint methodID,
JValue* args)
1110 return (
jbyte)(byte)o;
1116 JVM.SetPendingException(e);
1121 internal static jchar CallNonvirtualCharMethodA(
JNIEnv* pEnv, nint obj, nint clazz, nint methodID,
JValue* args)
1127 return (
jchar)(char)o;
1133 JVM.SetPendingException(e);
1138 internal static jshort CallNonvirtualShortMethodA(
JNIEnv* pEnv, nint obj, nint clazz, nint methodID,
JValue* args)
1150 JVM.SetPendingException(e);
1155 internal static jint CallNonvirtualIntMethodA(
JNIEnv* pEnv, nint obj, nint clazz, nint methodID,
JValue* args)
1161 return (
jint)(int)o;
1167 JVM.SetPendingException(e);
1172 internal static jlong CallNonvirtualLongMethodA(
JNIEnv* pEnv, nint obj, nint clazz, nint methodID,
JValue* args)
1178 return (
jlong)(long)o;
1184 JVM.SetPendingException(e);
1189 internal static jfloat CallNonvirtualFloatMethodA(
JNIEnv* pEnv, nint obj, nint clazz, nint methodID,
JValue* args)
1201 JVM.SetPendingException(e);
1206 internal static jdouble CallNonvirtualDoubleMethodA(
JNIEnv* pEnv, nint obj, nint clazz, nint methodID,
JValue* args)
1218 JVM.SetPendingException(e);
1223 internal static void CallNonvirtualVoidMethodA(
JNIEnv* pEnv, nint obj, nint clazz, nint methodID,
JValue* args)
1231 JVM.SetPendingException(e);
1239 var fw = tw.GetFieldWrapper(name, sig);
1240 if (fw ==
null || !fw.IsHideFromReflection)
1243 tw = fw.DeclaringType.BaseTypeWrapper;
1253 var n = DecodeMUTF8Argument(name, nameof(name));
1254 var s = DecodeMUTF8Argument(sig, nameof(sig));
1256 var tw = RuntimeJavaType.FromClass((
java.
lang.Class)pEnv->UnwrapRef(clazz));
1260 if (s.IndexOf(
'.') < 0)
1264 if (fw.IsStatic == isStatic)
1268 throw new java.
lang.NoSuchFieldError($
"{(isStatic ? "Static
" : "Instance
")} field '{n}' with signature '{s}' not found in class '{tw.Name}'");
1272 ExceptionDispatchInfo.Capture(x.ToJava()).Throw();
1277 internal static nint GetFieldID(
JNIEnv* pEnv, nint clazz,
byte* name,
byte* sig)
1281 return FindFieldID(pEnv, clazz, name, sig,
false);
1285 JVM.SetPendingException(e);
1295 internal static nint GetObjectField(
JNIEnv* pEnv, nint obj, nint fieldID)
1298 throw new NotImplementedException();
1302 return pEnv->MakeLocalRef(
GetFieldWrapper(fieldID).UnsafeGetValue<object>(pEnv->UnwrapRef(obj)));
1306 JVM.SetPendingException(e);
1312 internal static jboolean GetBooleanField(
JNIEnv* pEnv, nint obj, nint fieldID)
1315 throw new NotImplementedException();
1319 return GetFieldWrapper(fieldID).UnsafeGetValue<
bool>(pEnv->UnwrapRef(obj)) ? JNI_TRUE : JNI_FALSE;
1323 JVM.SetPendingException(e);
1329 internal static jbyte GetByteField(
JNIEnv* pEnv, nint obj, nint fieldID)
1332 throw new NotImplementedException();
1340 JVM.SetPendingException(e);
1346 internal static jchar GetCharField(
JNIEnv* pEnv, nint obj, nint fieldID)
1349 throw new NotImplementedException();
1353 return GetFieldWrapper(fieldID).UnsafeGetValue<
char>(pEnv->UnwrapRef(obj));
1357 JVM.SetPendingException(e);
1363 internal static jshort GetShortField(
JNIEnv* pEnv, nint obj, nint fieldID)
1366 throw new NotImplementedException();
1370 return GetFieldWrapper(fieldID).UnsafeGetValue<
short>(pEnv->UnwrapRef(obj));
1374 JVM.SetPendingException(e);
1380 internal static jint GetIntField(
JNIEnv* pEnv, nint obj, nint fieldID)
1383 throw new NotImplementedException();
1387 return GetFieldWrapper(fieldID).UnsafeGetValue<
int>(pEnv->UnwrapRef(obj));
1391 JVM.SetPendingException(e);
1397 internal static jlong GetLongField(
JNIEnv* pEnv, nint obj, nint fieldID)
1400 throw new NotImplementedException();
1404 return GetFieldWrapper(fieldID).UnsafeGetValue<
long>(pEnv->UnwrapRef(obj));
1408 JVM.SetPendingException(e);
1414 internal static jfloat GetFloatField(
JNIEnv* pEnv, nint obj, nint fieldID)
1417 throw new NotImplementedException();
1421 return GetFieldWrapper(fieldID).UnsafeGetValue<
float>(pEnv->UnwrapRef(obj));
1425 JVM.SetPendingException(e);
1431 internal static jdouble GetDoubleField(
JNIEnv* pEnv, nint obj, nint fieldID)
1434 throw new NotImplementedException();
1438 return GetFieldWrapper(fieldID).UnsafeGetValue<
double>(pEnv->UnwrapRef(obj));
1442 JVM.SetPendingException(e);
1448 internal static void SetObjectField(
JNIEnv* pEnv, nint obj, nint fieldID, nint val)
1451 throw new NotImplementedException();
1455 GetFieldWrapper(fieldID).UnsafeSetValue<
object>(pEnv->UnwrapRef(obj), pEnv->UnwrapRef(val));
1459 JVM.SetPendingException(e);
1464 internal static void SetBooleanField(
JNIEnv* pEnv, nint obj, nint fieldID,
jboolean val)
1467 throw new NotImplementedException();
1471 GetFieldWrapper(fieldID).UnsafeSetValue<
bool>(pEnv->UnwrapRef(obj), val != JNI_FALSE);
1475 JVM.SetPendingException(e);
1480 internal static void SetByteField(
JNIEnv* pEnv, nint obj, nint fieldID,
jbyte val)
1483 throw new NotImplementedException();
1487 GetFieldWrapper(fieldID).UnsafeSetValue<
byte>(pEnv->UnwrapRef(obj), (
byte)val);
1491 JVM.SetPendingException(e);
1496 internal static void SetCharField(
JNIEnv* pEnv, nint obj, nint fieldID,
jchar val)
1499 throw new NotImplementedException();
1503 GetFieldWrapper(fieldID).UnsafeSetValue<
char>(pEnv->UnwrapRef(obj), (
char)val);
1507 JVM.SetPendingException(e);
1512 internal static void SetShortField(
JNIEnv* pEnv, nint obj, nint fieldID,
jshort val)
1515 throw new NotImplementedException();
1519 GetFieldWrapper(fieldID).UnsafeSetValue<
short>(pEnv->UnwrapRef(obj), val);
1523 JVM.SetPendingException(e);
1528 internal static void SetIntField(
JNIEnv* pEnv, nint obj, nint fieldID,
jint val)
1531 throw new NotImplementedException();
1535 GetFieldWrapper(fieldID).UnsafeSetValue<
int>(pEnv->UnwrapRef(obj), val);
1539 JVM.SetPendingException(e);
1544 internal static void SetLongField(
JNIEnv* pEnv, nint obj, nint fieldID,
jlong val)
1547 throw new NotImplementedException();
1551 GetFieldWrapper(fieldID).UnsafeSetValue<
long>(pEnv->UnwrapRef(obj), val);
1555 JVM.SetPendingException(e);
1560 internal static void SetFloatField(
JNIEnv* pEnv, nint obj, nint fieldID,
jfloat val)
1563 throw new NotImplementedException();
1567 GetFieldWrapper(fieldID).UnsafeSetValue<
float>(pEnv->UnwrapRef(obj), val);
1571 JVM.SetPendingException(e);
1576 internal static void SetDoubleField(
JNIEnv* pEnv, nint obj, nint fieldID,
jdouble val)
1579 throw new NotImplementedException();
1583 GetFieldWrapper(fieldID).UnsafeSetValue<
double>(pEnv->UnwrapRef(obj), val);
1587 JVM.SetPendingException(e);
1592 internal static nint GetStaticMethodID(
JNIEnv* pEnv, nint clazz,
byte* name,
byte* sig)
1597 internal static nint CallStaticObjectMethodA(
JNIEnv* pEnv, nint clazz, nint methodID,
JValue* args)
1601 return pEnv->MakeLocalRef(
InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false));
1605 JVM.SetPendingException(e);
1610 internal static jboolean CallStaticBooleanMethodA(
JNIEnv* pEnv, nint clazz, nint methodID,
JValue* args)
1614 var o =
InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false);
1615 return o !=
null ? ((bool)o) ? JNI_TRUE : JNI_FALSE : JNI_FALSE;
1619 JVM.SetPendingException(e);
1624 internal static jbyte CallStaticByteMethodA(
JNIEnv* pEnv, nint clazz, nint methodID,
JValue* args)
1628 var o =
InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false);
1629 return o !=
null ? (
jbyte)(
byte)o : (sbyte)0;
1633 JVM.SetPendingException(e);
1638 internal static jchar CallStaticCharMethodA(
JNIEnv* pEnv, nint clazz, nint methodID,
JValue* args)
1642 var o =
InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false);
1643 return o !=
null ? (
jchar)(
char)o : (ushort)0;
1647 JVM.SetPendingException(e);
1652 internal static jshort CallStaticShortMethodA(
JNIEnv* pEnv, nint clazz, nint methodID,
JValue* args)
1656 var o =
InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false);
1657 return o !=
null ? (
jshort)(
short)o : (short)0;
1661 JVM.SetPendingException(e);
1666 internal static jint CallStaticIntMethodA(
JNIEnv* pEnv, nint clazz, nint methodID,
JValue* args)
1670 var o =
InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false);
1671 return o !=
null ? (
jint)(
int)o : 0;
1675 JVM.SetPendingException(e);
1680 internal static jlong CallStaticLongMethodA(
JNIEnv* pEnv, nint clazz, nint methodID,
JValue* args)
1684 var o =
InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false);
1685 return o !=
null ? (
jlong)(
long)o : 0;
1689 JVM.SetPendingException(e);
1694 internal static jfloat CallStaticFloatMethodA(
JNIEnv* pEnv, nint clazz, nint methodID,
JValue* args)
1698 var o =
InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false);
1699 return o !=
null ? (
jfloat)(
float)o : 0;
1703 JVM.SetPendingException(e);
1708 internal static jdouble CallStaticDoubleMethodA(
JNIEnv* pEnv, nint clazz, nint methodID,
JValue* args)
1712 var o =
InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false);
1713 return o !=
null ? (
jdouble)(
double)o : 0;
1717 JVM.SetPendingException(e);
1722 internal static void CallStaticVoidMethodA(
JNIEnv* pEnv, nint cls, nint methodID,
JValue* args)
1726 InvokeHelper(pEnv, IntPtr.Zero, methodID, args,
false);
1730 JVM.SetPendingException(e);
1734 internal static nint GetStaticFieldID(
JNIEnv* pEnv, nint clazz,
byte* name,
byte* sig)
1742 JVM.SetPendingException(e);
1747 internal static nint GetStaticObjectField(
JNIEnv* pEnv, nint clazz, nint fieldID)
1750 throw new NotImplementedException();
1754 return pEnv->MakeLocalRef(
GetFieldWrapper(fieldID).UnsafeGetValue<object>(
null));
1758 JVM.SetPendingException(e);
1764 internal static jboolean GetStaticBooleanField(
JNIEnv* pEnv, nint clazz, nint fieldID)
1767 throw new NotImplementedException();
1771 return GetFieldWrapper(fieldID).UnsafeGetValue<
bool>(
null) ? JNI_TRUE : JNI_FALSE;
1775 JVM.SetPendingException(e);
1781 internal static jbyte GetStaticByteField(
JNIEnv* pEnv, nint clazz, nint fieldID)
1784 throw new NotImplementedException();
1792 JVM.SetPendingException(e);
1798 internal static jchar GetStaticCharField(
JNIEnv* pEnv, nint clazz, nint fieldID)
1801 throw new NotImplementedException();
1809 JVM.SetPendingException(e);
1815 internal static jshort GetStaticShortField(
JNIEnv* pEnv, nint clazz, nint fieldID)
1818 throw new NotImplementedException();
1826 JVM.SetPendingException(e);
1832 internal static jint GetStaticIntField(
JNIEnv* pEnv, nint clazz, nint fieldID)
1835 throw new NotImplementedException();
1843 JVM.SetPendingException(e);
1849 internal static jlong GetStaticLongField(
JNIEnv* pEnv, nint clazz, nint fieldID)
1852 throw new NotImplementedException();
1860 JVM.SetPendingException(e);
1866 internal static jfloat GetStaticFloatField(
JNIEnv* pEnv, nint clazz, nint fieldID)
1869 throw new NotImplementedException();
1877 JVM.SetPendingException(e);
1883 internal static jdouble GetStaticDoubleField(
JNIEnv* pEnv, nint clazz, nint fieldID)
1886 throw new NotImplementedException();
1894 JVM.SetPendingException(e);
1900 internal static void SetStaticObjectField(
JNIEnv* pEnv, nint clazz, nint fieldID, nint val)
1903 throw new NotImplementedException();
1907 GetFieldWrapper(fieldID).UnsafeSetValue<
object>(
null, pEnv->UnwrapRef(val));
1911 JVM.SetPendingException(e);
1916 internal static void SetStaticBooleanField(
JNIEnv* pEnv, nint clazz, nint fieldID,
jboolean val)
1919 throw new NotImplementedException();
1927 JVM.SetPendingException(e);
1932 internal static void SetStaticByteField(
JNIEnv* pEnv, nint clazz, nint fieldID,
jbyte val)
1935 throw new NotImplementedException();
1943 JVM.SetPendingException(e);
1948 internal static void SetStaticCharField(
JNIEnv* pEnv, nint clazz, nint fieldID,
jchar val)
1951 throw new NotImplementedException();
1959 JVM.SetPendingException(e);
1964 internal static void SetStaticShortField(
JNIEnv* pEnv, nint clazz, nint fieldID,
jshort val)
1967 throw new NotImplementedException();
1975 JVM.SetPendingException(e);
1980 internal static void SetStaticIntField(
JNIEnv* pEnv, nint clazz, nint fieldID,
jint val)
1983 throw new NotImplementedException();
1991 JVM.SetPendingException(e);
1996 internal static void SetStaticLongField(
JNIEnv* pEnv, nint clazz, nint fieldID,
jlong val)
1999 throw new NotImplementedException();
2007 JVM.SetPendingException(e);
2012 internal static void SetStaticFloatField(
JNIEnv* pEnv, nint clazz, nint fieldID,
jfloat val)
2015 throw new NotImplementedException();
2023 JVM.SetPendingException(e);
2028 internal static void SetStaticDoubleField(
JNIEnv* pEnv, nint clazz, nint fieldID,
jdouble val)
2031 throw new NotImplementedException();
2037 internal static nint NewString(
JNIEnv* pEnv,
jchar* unicode,
int len)
2039 return pEnv->MakeLocalRef(
new String((
char*)unicode, 0, len));
2042 internal static jint GetStringLength(
JNIEnv* pEnv, nint str)
2044 return ((
string)pEnv->UnwrapRef(str)).Length;
2051 var s = (string)pEnv->UnwrapRef(str);
2055 return (
jchar*)(
void*)Marshal.StringToHGlobalUni(s);
2059 JVM.SetPendingException(e);
2064 internal static void ReleaseStringChars(
JNIEnv* pEnv, nint str,
jchar* chars)
2068 Marshal.FreeHGlobal((IntPtr)(
void*)chars);
2072 JVM.SetPendingException(e);
2077 internal static nint NewStringUTF(
JNIEnv* pEnv,
byte* bytes)
2081 return bytes ==
null ? IntPtr.Zero : pEnv->MakeLocalRef(DecodeMUTF8Argument(bytes, nameof(bytes)));
2085 JVM.SetPendingException(e);
2090 internal static jint GetStringUTFLength(
JNIEnv* pEnv, nint str)
2094 return MUTF8.GetByteCount((
string)pEnv->UnwrapRef(str));
2098 JVM.SetPendingException(e);
2103 internal static byte* GetStringUTFChars(
JNIEnv* pEnv, nint @
string,
jboolean* isCopy)
2107 var s = (string)pEnv->UnwrapRef(@
string);
2111 for (
int i = 0; i < s.Length; i++)
2114 if ((ch != 0) && (ch <= 0x7F))
2116 buf[j++] = (byte)ch;
2118 else if (ch <= 0x7FF)
2120 buf[j++] = (byte)((ch >> 6) | 0xC0);
2121 buf[j++] = (byte)((ch & 0x3F) | 0x80);
2125 buf[j++] = (byte)((ch >> 12) | 0xE0);
2126 buf[j++] = (byte)(((ch >> 6) & 0x3F) | 0x80);
2127 buf[j++] = (byte)((ch & 0x3F) | 0x80);
2140 JVM.SetPendingException(e);
2145 internal static void ReleaseStringUTFChars(
JNIEnv* pEnv, nint @
string,
byte* utf)
2150 internal static jsize GetArrayLength(
JNIEnv* pEnv, nint array)
2152 return ((Array)pEnv->UnwrapRef(array)).Length;
2155 internal static nint NewObjectArray(
JNIEnv* pEnv,
jsize len, nint clazz, nint init)
2160 var a = Array.CreateInstance(RuntimeJavaType.FromClass((
java.
lang.Class)pEnv->UnwrapRef(clazz)).TypeAsArrayType, len);
2161 var o = pEnv->UnwrapRef(init);
2163 for (
int i = 0; i < a.Length; i++)
2166 return pEnv->MakeLocalRef(a);
2168 catch (ArgumentOutOfRangeException)
2170 JVM.SetPendingException(
new java.
lang.NegativeArraySizeException());
2175 JVM.SetPendingException(e);
2180 internal static nint GetObjectArrayElement(
JNIEnv* pEnv, nint array,
jsize index)
2185 return pEnv->MakeLocalRef(((Array)pEnv->UnwrapRef(array)).GetValue(index));
2187 catch (IndexOutOfRangeException)
2189 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2194 internal static void SetObjectArrayElement(
JNIEnv* pEnv, nint array,
jsize index, nint val)
2199 ((Array)pEnv->UnwrapRef(array)).SetValue(pEnv->UnwrapRef(val), index);
2201 catch (NullReferenceException)
2203 JVM.SetPendingException(
new java.
lang.NullPointerException());
2205 catch (InvalidCastException)
2207 JVM.SetPendingException(
new java.
lang.ArrayStoreException());
2209 catch (IndexOutOfRangeException)
2211 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2215 JVM.SetPendingException(e);
2219 internal static nint NewBooleanArray(
JNIEnv* pEnv,
jsize len)
2223 return pEnv->MakeLocalRef(
new bool[len]);
2227 JVM.SetPendingException(x);
2232 internal static nint NewByteArray(
JNIEnv* pEnv,
jsize len)
2236 return pEnv->MakeLocalRef(
new byte[len]);
2240 JVM.SetPendingException(x);
2245 internal static nint NewCharArray(
JNIEnv* pEnv,
jsize len)
2249 return pEnv->MakeLocalRef(
new char[len]);
2253 JVM.SetPendingException(x);
2258 internal static nint NewShortArray(
JNIEnv* pEnv,
jsize len)
2262 return pEnv->MakeLocalRef(
new short[len]);
2266 JVM.SetPendingException(x);
2271 internal static nint NewIntArray(
JNIEnv* pEnv,
jsize len)
2275 return pEnv->MakeLocalRef(
new int[len]);
2279 JVM.SetPendingException(x);
2284 internal static nint NewLongArray(
JNIEnv* pEnv,
jsize len)
2288 return pEnv->MakeLocalRef(
new long[len]);
2292 JVM.SetPendingException(x);
2297 internal static nint NewFloatArray(
JNIEnv* pEnv,
jsize len)
2301 return pEnv->MakeLocalRef(
new float[len]);
2305 JVM.SetPendingException(x);
2310 internal static nint NewDoubleArray(
JNIEnv* pEnv,
jsize len)
2314 return pEnv->MakeLocalRef(
new double[len]);
2318 JVM.SetPendingException(x);
2325 var b = (
bool[])pEnv->UnwrapRef(array);
2327 for (
int i = 0; i < b.Length; i++)
2328 p[i] = b[i] ? JNI_TRUE : JNI_FALSE;
2338 byte[] b = (
byte[])pEnv->UnwrapRef(array);
2340 for (
int i = 0; i < b.Length; i++)
2351 char[] b = (
char[])pEnv->UnwrapRef(array);
2353 Marshal.Copy(b, 0, buf, b.Length);
2358 return (
jchar*)(
void*)buf;
2363 short[] b = (
short[])pEnv->UnwrapRef(array);
2365 Marshal.Copy(b, 0, buf, b.Length);
2370 return (
jshort*)(
void*)buf;
2373 internal static jint* GetIntArrayElements(
JNIEnv* pEnv, nint array,
jboolean* isCopy)
2375 int[] b = (
int[])pEnv->UnwrapRef(array);
2377 Marshal.Copy(b, 0, buf, b.Length);
2382 return (
jint*)(
void*)buf;
2387 long[] b = (
long[])pEnv->UnwrapRef(array);
2389 Marshal.Copy(b, 0, buf, b.Length);
2394 return (
jlong*)(
void*)buf;
2399 float[] b = (
float[])pEnv->UnwrapRef(array);
2401 Marshal.Copy(b, 0, buf, b.Length);
2406 return (
jfloat*)(
void*)buf;
2411 double[] b = (
double[])pEnv->UnwrapRef(array);
2413 Marshal.Copy(b, 0, buf, b.Length);
2421 internal static void ReleaseBooleanArrayElements(
JNIEnv* pEnv, nint array,
jboolean* elems,
jint mode)
2423 if (mode == 0 || mode == JNI_COMMIT)
2425 bool[] b = (
bool[])pEnv->UnwrapRef(array);
2426 for (
int i = 0; i < b.Length; i++)
2428 b[i] = elems[i] != JNI_FALSE;
2431 if (mode == 0 || mode == JNI_ABORT)
2437 internal static void ReleaseByteArrayElements(
JNIEnv* pEnv, nint array,
jbyte* elems,
jint mode)
2439 if (mode == 0 || mode == JNI_COMMIT)
2441 byte[] b = (
byte[])pEnv->UnwrapRef(array);
2442 for (
int i = 0; i < b.Length; i++)
2444 b[i] = (byte)elems[i];
2447 if (mode == 0 || mode == JNI_ABORT)
2453 internal static void ReleaseCharArrayElements(
JNIEnv* pEnv, nint array,
jchar* elems,
jint mode)
2455 if (mode == 0 || mode == JNI_COMMIT)
2457 char[] b = (
char[])pEnv->UnwrapRef(array);
2458 Marshal.Copy((IntPtr)(
void*)elems, b, 0, b.Length);
2460 if (mode == 0 || mode == JNI_ABORT)
2466 internal static void ReleaseShortArrayElements(
JNIEnv* pEnv, nint array,
jshort* elems,
jint mode)
2468 if (mode == 0 || mode == JNI_COMMIT)
2470 short[] b = (
short[])pEnv->UnwrapRef(array);
2471 Marshal.Copy((IntPtr)(
void*)elems, b, 0, b.Length);
2473 if (mode == 0 || mode == JNI_ABORT)
2479 internal static void ReleaseIntArrayElements(
JNIEnv* pEnv, nint array,
jint* elems,
jint mode)
2481 if (mode == 0 || mode == JNI_COMMIT)
2483 int[] b = (
int[])pEnv->UnwrapRef(array);
2484 Marshal.Copy((IntPtr)(
void*)elems, b, 0, b.Length);
2486 if (mode == 0 || mode == JNI_ABORT)
2492 internal static void ReleaseLongArrayElements(
JNIEnv* pEnv, nint array,
jlong* elems,
jint mode)
2494 if (mode == 0 || mode == JNI_COMMIT)
2496 long[] b = (
long[])pEnv->UnwrapRef(array);
2497 Marshal.Copy((IntPtr)(
void*)elems, b, 0, b.Length);
2499 if (mode == 0 || mode == JNI_ABORT)
2505 internal static void ReleaseFloatArrayElements(
JNIEnv* pEnv, nint array,
jfloat* elems,
jint mode)
2507 if (mode == 0 || mode == JNI_COMMIT)
2509 float[] b = (
float[])pEnv->UnwrapRef(array);
2510 Marshal.Copy((IntPtr)(
void*)elems, b, 0, b.Length);
2512 if (mode == 0 || mode == JNI_ABORT)
2518 internal static void ReleaseDoubleArrayElements(
JNIEnv* pEnv, nint array,
jdouble* elems,
jint mode)
2520 if (mode == 0 || mode == JNI_COMMIT)
2522 double[] b = (
double[])pEnv->UnwrapRef(array);
2523 Marshal.Copy((IntPtr)(
void*)elems, b, 0, b.Length);
2525 if (mode == 0 || mode == JNI_ABORT)
2531 internal static void GetBooleanArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jboolean* buf)
2535 bool[] b = (
bool[])pEnv->UnwrapRef(array);
2536 sbyte* p = (sbyte*)(
void*)buf;
2537 for (
int i = 0; i < len; i++)
2539 *p++ = b[start + i] ? JNI_TRUE : JNI_FALSE;
2542 catch (IndexOutOfRangeException)
2544 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2548 internal static void GetByteArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jbyte* buf)
2552 byte[] b = (
byte[])pEnv->UnwrapRef(array);
2553 byte* p = (
byte*)(
void*)buf;
2554 for (
int i = 0; i < len; i++)
2556 *p++ = b[start + i];
2559 catch (IndexOutOfRangeException)
2561 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2565 internal static void GetCharArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jchar* buf)
2569 char[] b = (
char[])pEnv->UnwrapRef(array);
2570 Marshal.Copy(b, start, (IntPtr)buf, len);
2572 catch (ArgumentOutOfRangeException)
2574 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2578 internal static void GetShortArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jshort* buf)
2582 short[] b = (
short[])pEnv->UnwrapRef(array);
2583 Marshal.Copy(b, start, (IntPtr)buf, len);
2585 catch (ArgumentOutOfRangeException)
2587 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2591 internal static void GetIntArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jint* buf)
2595 int[] b = (
int[])pEnv->UnwrapRef(array);
2596 Marshal.Copy(b, start, (IntPtr)buf, len);
2598 catch (ArgumentOutOfRangeException)
2600 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2604 internal static void GetLongArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jlong* buf)
2608 long[] b = (
long[])pEnv->UnwrapRef(array);
2609 Marshal.Copy(b, start, (IntPtr)buf, len);
2611 catch (ArgumentOutOfRangeException)
2613 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2617 internal static void GetFloatArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jfloat* buf)
2621 float[] b = (
float[])pEnv->UnwrapRef(array);
2622 Marshal.Copy(b, start, (IntPtr)buf, len);
2624 catch (ArgumentOutOfRangeException)
2626 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2630 internal static void GetDoubleArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jdouble* buf)
2634 double[] b = (
double[])pEnv->UnwrapRef(array);
2635 Marshal.Copy(b, start, (IntPtr)buf, len);
2637 catch (ArgumentOutOfRangeException)
2639 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2643 internal static void SetBooleanArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jboolean* buf)
2647 bool[] b = (
bool[])pEnv->UnwrapRef(array);
2648 sbyte* p = (sbyte*)(
void*)buf;
2649 for (
int i = 0; i < len; i++)
2651 b[start + i] = *p++ != JNI_FALSE;
2654 catch (IndexOutOfRangeException)
2656 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2660 internal static void SetByteArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jbyte* buf)
2664 byte[] b = (
byte[])pEnv->UnwrapRef(array);
2665 byte* p = (
byte*)(
void*)buf;
2666 for (
int i = 0; i < len; i++)
2668 b[start + i] = *p++;
2671 catch (IndexOutOfRangeException)
2673 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2677 internal static void SetCharArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jchar* buf)
2681 char[] b = (
char[])pEnv->UnwrapRef(array);
2682 Marshal.Copy((IntPtr)buf, b, start, len);
2684 catch (ArgumentOutOfRangeException)
2686 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2690 internal static void SetShortArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jshort* buf)
2694 short[] b = (
short[])pEnv->UnwrapRef(array);
2695 Marshal.Copy((IntPtr)buf, b, start, len);
2697 catch (ArgumentOutOfRangeException)
2699 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2703 internal static void SetIntArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jint* buf)
2707 int[] b = (
int[])pEnv->UnwrapRef(array);
2708 Marshal.Copy((IntPtr)buf, b, start, len);
2710 catch (ArgumentOutOfRangeException)
2712 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2716 internal static void SetLongArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jlong* buf)
2720 long[] b = (
long[])pEnv->UnwrapRef(array);
2721 Marshal.Copy((IntPtr)buf, b, start, len);
2723 catch (ArgumentOutOfRangeException)
2725 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2729 internal static void SetFloatArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jfloat* buf)
2733 float[] b = (
float[])pEnv->UnwrapRef(array);
2734 Marshal.Copy((IntPtr)buf, b, start, len);
2736 catch (ArgumentOutOfRangeException)
2738 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2742 internal static void SetDoubleArrayRegion(
JNIEnv* pEnv, nint array,
int start,
int len,
jdouble* buf)
2746 double[] b = (
double[])pEnv->UnwrapRef(array);
2747 Marshal.Copy((IntPtr)buf, b, start, len);
2749 catch (ArgumentOutOfRangeException)
2751 JVM.SetPendingException(
new java.
lang.ArrayIndexOutOfBoundsException());
2755 [StructLayout(LayoutKind.Sequential)]
2759 public byte* signature;
2767 var wrapper = RuntimeJavaType.FromClass((
java.
lang.Class)pEnv->UnwrapRef(clazz));
2769 for (
int i = 0; i < nMethods; i++)
2771 var methodName = DecodeMUTF8(methods[i].name);
2772 var methodSig = DecodeMUTF8(methods[i].signature);
2774 JVM.Context.
Diagnostics.
GenericJniInfo($
"Registering native method: {wrapper.Name}.{methodName}{methodSig}, fnPtr = 0x{((IntPtr)methods[i].fnPtr).ToInt64():X}");
2778 if (methodSig.IndexOf(
'.') < 0)
2779 fi = wrapper.TypeAsTBD.GetField(METHOD_PTR_FIELD_PREFIX + methodName + methodSig, BindingFlags.Static | BindingFlags.NonPublic);
2784 throw new java.
lang.NoSuchMethodError(methodName);
2787 fi.SetValue(
null, (IntPtr)methods[i].fnPtr);
2793 JVM.SetPendingException(e.ToJava());
2798 JVM.SetPendingException(e);
2803 internal static jint UnregisterNatives(
JNIEnv* pEnv, nint clazz)
2807 RuntimeJavaType wrapper = RuntimeJavaType.FromClass((
java.
lang.Class)pEnv->UnwrapRef(clazz));
2810 foreach (
FieldInfo fi
in wrapper.TypeAsTBD.GetFields(BindingFlags.Static | BindingFlags.NonPublic))
2812 string name = fi.Name;
2813 if (name.StartsWith(METHOD_PTR_FIELD_PREFIX))
2815 JVM.Context.
Diagnostics.
GenericJniInfo($
"Unregistering native method: {wrapper.Name}.{name.Substring(METHOD_PTR_FIELD_PREFIX.Length)}");
2816 fi.SetValue(
null, IntPtr.Zero);
2823 JVM.SetPendingException(x.ToJava());
2828 JVM.SetPendingException(x);
2833 internal static jint MonitorEnter(
JNIEnv* pEnv, nint obj)
2839#pragma warning disable 618
2840 System.Threading.Monitor.Enter(pEnv->UnwrapRef(obj));
2841#pragma warning restore 618
2846 JVM.SetPendingException(x);
2851 internal static jint MonitorExit(
JNIEnv* pEnv, nint obj)
2855 System.Threading.Monitor.Exit(pEnv->UnwrapRef(obj));
2860 JVM.SetPendingException(x);
2867 *ppJavaVM =
JavaVM.pJavaVM;
2873 string s = (string)pEnv->UnwrapRef(str);
2876 if (start < 0 || start > s.Length || s.Length - start < len)
2878 JVM.SetPendingException(
new java.
lang.StringIndexOutOfBoundsException());
2883 char* p = (
char*)(
void*)buf;
2885 for (
int i = 0; i < len; i++)
2887 *p++ = s[start + i];
2894 JVM.SetPendingException(
new java.
lang.NullPointerException());
2898 internal static void GetStringUTFRegion(
JNIEnv* pEnv, nint str,
jsize start,
jsize len,
byte* buf)
2900 string s = (string)pEnv->UnwrapRef(str);
2903 if (start < 0 || start > s.Length || s.Length - start < len)
2905 JVM.SetPendingException(
new java.
lang.StringIndexOutOfBoundsException());
2910 byte* p = (
byte*)(
void*)buf;
2911 for (
int i = 0; i < len; i++)
2913 char ch = s[start + i];
2914 if ((ch != 0) && (ch <= 0x7F))
2918 else if (ch <= 0x7FF)
2920 *p++ = (byte)((ch >> 6) | 0xC0);
2921 *p++ = (byte)((ch & 0x3F) | 0x80);
2925 *p++ = (byte)((ch >> 12) | 0xE0);
2926 *p++ = (byte)(((ch >> 6) & 0x3F) | 0x80);
2927 *p++ = (byte)((ch & 0x3F) | 0x80);
2935 JVM.SetPendingException(
new java.
lang.NullPointerException());
2941 if (pinHandleInUseCount == pinHandleMaxCount)
2943 var newCount = pinHandleMaxCount + 32;
2944 var pNew = (GCHandle*)
JNIMemory.
Alloc(
sizeof(GCHandle) * newCount);
2945 for (
int i = 0; i < pinHandleMaxCount; i++)
2946 pNew[i] = pinHandles[i];
2948 for (
int i = pinHandleMaxCount; i < newCount; i++)
2949 pNew[i] =
new GCHandle();
2953 pinHandleMaxCount = newCount;
2956 var index = pinHandleInUseCount++;
2957 if (pinHandles[index].IsAllocated ==
false)
2958 pinHandles[index] = GCHandle.Alloc(
null, GCHandleType.Pinned);
2960 pinHandles[index].Target = obj;
2961 return (
void*)pinHandles[index].AddrOfPinnedObject();
2966 for (
int i = 0; i < pinHandleInUseCount; i++)
2968 if (pinHandles[i].Target == obj)
2970 pinHandles[i].Target = pinHandles[--pinHandleInUseCount].Target;
2971 pinHandles[pinHandleInUseCount].Target =
null;
2977 internal static void* GetPrimitiveArrayCritical(
JNIEnv* pEnv, nint array,
jboolean* isCopy)
2980 *isCopy = JNI_FALSE;
2982 return pEnv->
PinObject(pEnv->UnwrapRef(array));
2985 internal static void ReleasePrimitiveArrayCritical(
JNIEnv* pEnv, nint array,
void* carray,
jint mode)
3000 *isCopy = JNI_FALSE;
3011 internal static void ReleaseStringCritical(
JNIEnv* pEnv, nint str,
jchar* cstring)
3022 internal static nint NewWeakGlobalRef(
JNIEnv* pEnv, nint obj)
3024 var o = pEnv->UnwrapRef(obj);
3033 internal static void DeleteWeakGlobalRef(
JNIEnv* pEnv, nint obj)
3042 Debug.Assert(
false,
"Local ref passed to DeleteWeakGlobalRef");
3052 return JVM.GetPendingException() !=
null ? JNI_TRUE : JNI_FALSE;
3055 internal static nint NewDirectByteBuffer(
JNIEnv* pEnv, IntPtr address,
jlong capacity)
3058 throw new NotImplementedException();
3062 if (capacity < 0 || capacity >
int.MaxValue)
3064 JVM.SetPendingException(
new java.
lang.IllegalArgumentException(
"capacity"));
3068 return pEnv->MakeLocalRef(global::java.nio.DirectByteBuffer.__new(address.ToInt64(), (
int)capacity));
3072 JVM.SetPendingException(x);
3078 internal static void* GetDirectBufferAddress(
JNIEnv* pEnv, nint buf)
3082 return (
void*)(IntPtr)((sun.nio.ch.DirectBuffer)pEnv->UnwrapRef(buf)).address();
3086 JVM.SetPendingException(x);
3087 return (
void*)IntPtr.Zero;
3091 internal static jlong GetDirectBufferCapacity(
JNIEnv* pEnv, nint buf)
3095 return (
jlong)(long)((
java.
nio.Buffer)pEnv->UnwrapRef(buf)).capacity();
3099 JVM.SetPendingException(x);
3106 int i = ((IntPtr)obj).ToInt32();
3111 if ((i & (1 << 30)) != 0)
3117 internal nint MakeLocalRef(
object obj)
3119 return GetContext().MakeLocalRef(obj);
3122 internal object UnwrapRef(nint o)
3125 return GetContext().UnwrapLocalRef(o);
3131 internal static object UnwrapRef(JNIEnvContext env, nint o)
3134 return env.UnwrapLocalRef(o);