private static bool CheckAlreadyLoaded(BridgeSetup newSetup, JNIEnv env) { if (clrLoaded) { return true; } if (newSetup.BindNative) { JniLocalHandle br = env.FindClassPtrNoThrow("net/sf/jni4net/Bridge"); if (JniLocalHandle.IsNull(br)) { throw new JNIException("Can't find class net.sf.jni4net.Bridge on classpath"); } IntPtr ir = env.GetStaticFieldIDPtr(br, "isRegistered", "Z"); bool isRegistered = env.GetStaticBooleanField(br, ir); if (isRegistered) { // rather neat. When called like Clr->Java->Clr this dll gets loaded twice. // which means two separate sets CLR of classes and static members if (newSetup.Verbose) { Console.WriteLine("Already initialized jni4net core before"); } return true; } } return false; }
internal static void BindCore(JNIEnv env, BridgeSetup newSetup) { if (CheckAlreadyLoaded(newSetup, env)) { return; } if (newSetup.Verbose) { var homeDll = new Uri(typeof(Bridge).Assembly.GetName().CodeBase).AbsolutePath; Console.WriteLine("loading core from " + homeDll); } setup = newSetup; if (!setup.BindCoreOnly) { RegisterAssembly(typeof (Bridge).Assembly); } __Bridge.Init(env); if (Setup.Verbose) { Console.WriteLine("Initialized jni4net core"); } if (Setup.BindNative) { JniLocalHandle br = env.FindClassPtr("net/sf/jni4net/Bridge"); IntPtr ir = env.GetStaticFieldIDPtr(br, "isRegistered", "Z"); env.SetStaticBooleanField(br, ir, true); if (!env.GetStaticBooleanField(br, ir)) { Console.Error.WriteLine("Can't mark bridge"); } Ref.Init(); Out.Init(); } if (Setup.Verbose) { var homeDll = new Uri(typeof(Bridge).Assembly.GetName().CodeBase).AbsolutePath; Console.WriteLine("core loaded from " + homeDll); } AppDomain.CurrentDomain.DomainUnload += CurrentDomain_DomainUnload; clrLoaded = true; }