Пример #1
0
    private static void PrepareJNI(object[] input, out jvalue[] output, string ret, out string sig)
    {
        refKeep.Clear();

        StringBuilder signature = new StringBuilder();

        signature.Append("(");

        output = new jvalue[input.Length];

        int x;

        for (x = 0; x < input.Length; x++)
        {
            object obj = input[x];

            if (obj.GetType() == typeof(string))
            {
                AndroidJavaObject objn = new AndroidJavaObject("java.lang.String", (string)obj);
                output[x].l = objn.GetRawObject();
                signature.Append("Ljava/lang/String;");
                refKeep.Add(objn);
            }
            else if (obj.GetType() == typeof(int))
            {
                output[x].i = (int)obj;
                signature.Append("I");
            }
            else if (obj.GetType() == typeof(bool))
            {
                output[x].z = (bool)obj;
                signature.Append("Z");
            }
            else if (obj == ACTIVITY)
            {
                AndroidJavaClass  jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject currentActivity = jc.GetStatic <AndroidJavaObject>("currentActivity");
                output[x].l = currentActivity.GetRawObject();
                signature.Append("Landroid/app/Activity;");
                refKeep.Add(currentActivity);
            }
            else if (obj == CONTEXT)
            {
                AndroidJavaClass  jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                AndroidJavaObject currentActivity = jc.GetStatic <AndroidJavaObject>("currentActivity");
                output[x].l = currentActivity.GetRawObject();
                signature.Append("Landroid/content/Context;");
                refKeep.Add(currentActivity);
            }
            else
            {
                throw new Exception("Invalid JNI parameter type");
            }
        }

        signature.Append(")");
        signature.Append(ret);

        sig = signature.ToString();
    }
Пример #2
0
    private static void AndroidRelease()
    {
        var j_activity = class_UnityPlayer.GetStatic <AndroidJavaObject> ("currentActivity");

        jvalue[] args = new jvalue[1];
        args [0].l = j_activity.GetRawObject();
        AndroidJNI.CallStaticVoidMethod(class_UnityDre, method_release, args);
    }
Пример #3
0
 private static void BurstlyAdWrapper_createInterstitialPlacement(string placementName, string appId, string zoneId)
 {
     jvalue[] args = new jvalue[3];
     args[0].l = AndroidJNI.NewStringUTF(placementName);
     args[1].l = AndroidJNI.NewStringUTF(appId);
     args[2].l = AndroidJNI.NewStringUTF(zoneId);
     AndroidJNI.CallStaticVoidMethod(BurstlyPluginClass, methodID_createInterstitialPlacement, args);
 }
Пример #4
0
 private static void BurstlyAdWrapper_setBannerOrigin(string placementName, float originX, float originY)
 {
     jvalue[] args = new jvalue[3];
     args[0].l = AndroidJNI.NewStringUTF(placementName);
     args[1].f = originX;
     args[2].f = originY;
     AndroidJNI.CallStaticVoidMethod(BurstlyPluginClass, methodID_setBannerOrigin, args);
 }
Пример #5
0
 static bool AndroidShowV4VC(bool popup_result, string zone_id)
 {
     jvalue[] args = new jvalue[2];
     args[0].z = popup_result;
     args[1].l = AndroidJNI.NewStringUTF(zone_id);
     AndroidJNI.CallStaticBooleanMethod(class_UnityADC, method_showV4VC, args);
     return(true);
 }
Пример #6
0
    public static string GetV4VCName(string zone_id)
    {
        jvalue[] args = new jvalue[1];
        args[0].l = AndroidJNI.NewStringUTF(zone_id);
        string name = AndroidJNI.CallStaticStringMethod(class_UnityADC, method_getV4VCName, args);

        return(name);
    }
Пример #7
0
    jvalue ConvertFloatArrayToJNI(float[] values)
    {
        IntPtr jAryPtr = AndroidJNIHelper.ConvertToJNIArray(values);
        jvalue jv      = new jvalue();

        jv.l = jAryPtr;
        return(jv);
    }
Пример #8
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CacheEvent" /> class.
        /// </summary>
        /// <param name="regionPath">Cache region path.</param>
        /// <param name="key">Cache key as <see cref="T:System.Int32" /></param>
        /// <param name="eventType"><see cref="T:TcmCDService.CacheTypes.CacheEventType" /></param>
        public CacheEvent(string regionPath, int key, CacheEventType eventType) : base(JNIHandle.NULL)
        {
            jvalue[] args = new jvalue[3];

            using (JavaMethodArguments arguments = new JavaMethodArguments(args).Add(regionPath).Add(new Java.Lang.Integer(key)).Add((int)eventType))
            {
                base.JObject = (long)mConstructor.CallObject(this, arguments);
            }
        }
Пример #9
0
    public static void AndroidPause()
    {
        var j_activity = class_UnityPlayer.GetStatic <AndroidJavaObject>("currentActivity");

        jvalue[] args = new jvalue[1];
        args[0].l = j_activity.GetRawObject();

        AndroidJNI.CallStaticVoidMethod(class_UnityADC, method_pause, args);
    }
Пример #10
0
 public static jvalue[] createJavaParam(params IntPtr[] jparams)
 {
     jvalue[] jret = new jvalue[jparams.Length];
     for (int i = 0; i < jparams.Length; i++)
     {
         jret [i].l = jparams [i];
     }
     return(jret);
 }
        /// <summary>
        /// Unexports a previously exported object
        /// </summary>
        /// <param name="obj"><see cref="T:Java.Lang.Object" /></param>
        /// <param name="force">if set to <c>true</c> [force unexport].</param>
        /// <returns><c>true</c> if unexported, otherwise <c>false</c>.</returns>
        public static bool UnexportObject(JuggerNETProxyObject javaProxyObject, bool force)
        {
            jvalue[] args = new jvalue[2];

            using (JavaMethodArguments arguments = new JavaMethodArguments(args).Add(javaProxyObject).Add(force))
            {
                return(mUnexportObject.CallBool(null, arguments));
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="RMICacheChannelConnector"/> class.
        /// </summary>
        /// <param name="host">Tridion Cache Channel RMI Host</param>
        /// <param name="port">Tridion Cache Channel RMI Port</param>
        /// <param name="instanceIdentifier">Tridion Instance identifier.</param>
        public RMICacheChannelConnector(String host, int port, String instanceIdentifier) : base(JNIHandle.NULL)
        {
            jvalue[] args = new jvalue[3];

            using (JavaMethodArguments arguments = new JavaMethodArguments(args).Add(host).Add(port).Add(instanceIdentifier))
            {
                base.JObject = (long)mConstructor2.CallObject(this, arguments);
            }
        }
        /// <summary>
        /// Unexports a previously exported object
        /// </summary>
        /// <param name="obj"><see cref="T:Java.Lang.Object" /></param>
        /// <param name="force">if set to <c>true</c> [force unexport].</param>
        /// <returns><c>true</c> if unexported, otherwise <c>false</c>.</returns>
        public static bool UnexportObject(JuggerNETProxyObject javaProxyObject, bool force)
        {
            jvalue[] args = new jvalue[2];

            using (JavaMethodArguments arguments = new JavaMethodArguments(args).Add(javaProxyObject).Add(force))
            {
                return mUnexportObject.CallBool(null, arguments);
            }
        }
Пример #14
0
 static void AndroidNotifyIAPComplete(string zone_id, string trans_id, string currency_code, double price)
 {
     jvalue[] args = new jvalue[4];
     args[0].l = AndroidJNI.NewStringUTF(zone_id);
     args[1].l = AndroidJNI.NewStringUTF(trans_id);
     args[2].l = AndroidJNI.NewStringUTF(currency_code);
     args[3].d = price;
     AndroidJNI.CallStaticVoidMethod(class_UnityADC, method_notifyIAPComplete, args);
 }
Пример #15
0
    /**
     * Show the Swarm Leaderboards screen in a pop up.
     */
    public static void showLeaderboards()
    {
                #if UNITY_ANDROID
                        #if !UNITY_EDITOR
        jvalue[] args = new jvalue[0];

        AndroidJNI.CallStaticVoidMethod(swarmUnityInterface, showLeaderboardsMethod, args);
                        #endif
                #endif
    }
Пример #16
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CacheEvent" /> class.
        /// </summary>
        /// <param name="regionPath">Cache region path.</param>
        /// <param name="key">Cache key as <see cref="T:System.Int32" /></param>
        /// <param name="eventType"><see cref="T:TcmCDService.CacheTypes.CacheEventType" /></param>
        public CacheEvent(string regionPath, int key, CacheEventType eventType)
            : base(JNIHandle.NULL)
        {
            jvalue[] args = new jvalue[3];

            using (JavaMethodArguments arguments = new JavaMethodArguments(args).Add(regionPath).Add(new Java.Lang.Integer(key)).Add((int)eventType))
            {
                base.JObject = (long)mConstructor.CallObject(this, arguments);
            }
        }
Пример #17
0
 static void AndroidSetCustomID(string custom_id)
 {
     if (!adr_initialized)
     {
         AndroidInitializePlugin();
     }
     jvalue[] args = new jvalue[1];
     args[0].l = AndroidJNI.NewStringUTF(custom_id);
     AndroidJNI.CallStaticVoidMethod(class_UnityADC, method_setCustomID, args);
 }
Пример #18
0
 public void UpdateUserAccount()
 {
     if (this.androidBridge == IntPtr.Zero)
     {
         UnityEngine.Debug.LogError("androidBridge is null, UpdateUserAccount down failed!");
         return;
     }
     jvalue[] args = new jvalue[0];
     AndroidJNI.CallVoidMethod(this.androidBridge, QGameKitAndroidBridge.notifyUserAccountMethodID, args);
 }
Пример #19
0
 public bool StopLiveBroadcast()
 {
     if (this.androidBridge == IntPtr.Zero)
     {
         UnityEngine.Debug.LogError("androidBridge is null, stop liveBroadcast failed!");
         return(false);
     }
     jvalue[] args = new jvalue[0];
     return(AndroidJNI.CallBooleanMethod(this.androidBridge, QGameKitAndroidBridge.stopLiveBroadcastMethodID, args));
 }
Пример #20
0
 public void TearDown()
 {
     if (this.androidBridge == IntPtr.Zero)
     {
         UnityEngine.Debug.LogError("androidBridge is null, tear down failed!");
         return;
     }
     jvalue[] args = new jvalue[0];
     AndroidJNI.CallVoidMethod(this.androidBridge, QGameKitAndroidBridge.tearDownMethodID, args);
 }
Пример #21
0
 public bool IsLiveBroadcastSupported()
 {
     if (this.androidBridge == IntPtr.Zero)
     {
         UnityEngine.Debug.LogError("androidBridge is null, cann't get liveBroadcast support!");
         return(false);
     }
     jvalue[] args = new jvalue[0];
     return(AndroidJNI.CallBooleanMethod(this.androidBridge, QGameKitAndroidBridge.isLiveBroadcastSupportedMethodID, args));
 }
        /// <summary>
        /// Initializes a new instance of the <see cref="RMICacheChannelConnector"/> class.
        /// </summary>
        /// <param name="host">Tridion Cache Channel RMI Host</param>
        /// <param name="port">Tridion Cache Channel RMI Port</param>
        /// <param name="instanceIdentifier">Tridion Instance identifier.</param>
        public RMICacheChannelConnector(String host, int port, String instanceIdentifier)
            : base(JNIHandle.NULL)
        {
            jvalue[] args = new jvalue[3];

            using (JavaMethodArguments arguments = new JavaMethodArguments(args).Add(host).Add(port).Add(instanceIdentifier))
            {
                base.JObject = (long)mConstructor2.CallObject(this, arguments);
            }
        }
Пример #23
0
    /**
     * Enable notification popups (i.e, popups shown when a score is submitted, an achievement is earned, etc.)
     */
    public static void enableNotificationPopups()
    {
                #if UNITY_ANDROID
                        #if !UNITY_EDITOR
        jvalue[] args = new jvalue[0];

        AndroidJNI.CallStaticVoidMethod(swarmUnityInterface, enableNotificationPopupsMethod, args);
                        #endif
                #endif
    }
Пример #24
0
    /**
     * Enable alternative market compatibility (example: Amazon Marketplace).  Calling this function make
     * your game or app compatible with the requirements for launching on non-google play markets.
     */
    public static void enableAlternativeMarketCompatability()
    {
                #if UNITY_ANDROID
                        #if !UNITY_EDITOR
        jvalue[] args = new jvalue[0];

        AndroidJNI.CallStaticVoidMethod(swarmUnityInterface, enableAlternativeMarketCompatabilityMethod, args);
                        #endif
                #endif
    }
Пример #25
0
    private void CaptureFrame(int textureID)
    {
        if (capturingObject == IntPtr.Zero)
        {
            return;
        }

        jvalue[] args = new jvalue[1];
        args[0].i = textureID;
        AndroidJNI.CallVoidMethod(capturingObject, captureFrameMethodID, args);
    }
Пример #26
0
        /// <summary>
        /// Add extended data to the intent. The name must include a package
        /// prefix, for example the app com.UnityAndroidNative.contacts would use names
        /// like "com.android.contacts.ShowAll".
        /// </summary>
        /// <param name="name">The name of the extra data, with package prefix.</param>
        /// <param name="value">The Parcelable[] data value.</param>
        /// <returns>Returns the same Intent object, for chaining multiple calls</returns>
        /// <seealso cref="PutExtras"/>
        /// <seealso cref="RemoveExtra"/>
        /// <seealso cref="getParcelableArrayExtra(string) "/>
        public Intent PutExtra(string name, Parcelable[] value)
        {
            IntPtr methodId = AndroidJNIHelper.GetMethodID(mClass, "putExtra", "(Ljava/lang/String;[Landroid/os/Parcelable;)Landroid/content/Intent;", false);

            jvalue[] jArgs = new jvalue[2];
            jArgs[0].l = AndroidJNI.NewStringUTF(name);
            jArgs[1].l = ConvertToJNIArray <Intent>(value);
            AndroidJNI.CallObjectMethod(RawObject, methodId, jArgs);

            return(this);
        }
Пример #27
0
    // ---------------------------------------------------------------------------------------------------

    public static string GetDCIMPath()
    {
        IntPtr classID = AndroidJNI.FindClass("com/intel/inde/mp/samples/unity/Capturing"); // com.intel.inde.mp.samples.unity // com/intel/penelope/Capturing

        IntPtr getDirectoryDCIMMethodID = AndroidJNI.GetStaticMethodID(classID, "getDirectoryDCIM", "()Ljava/lang/String;");

        jvalue[] args     = new jvalue[0];
        string   videoDir = AndroidJNI.CallStaticStringMethod(classID, getDirectoryDCIMMethodID, args);

        return(videoDir);
    }
Пример #28
0
    /**
     * Consume the item with the requested id number.
     *
     * @param itemId The id number of the item to consume.
     */
    public static void consumeItem(int itemId)
    {
                #if UNITY_ANDROID
                        #if !UNITY_EDITOR
        jvalue[] args = new jvalue[1];
        args[0].i = itemId;

        AndroidJNI.CallStaticVoidMethod(swarmUnityInterface, consumeItemMethod, args);
                        #endif
                #endif
    }
Пример #29
0
    /**
     * Display the leaderboard with the specified Id number.
     *
     * @param leadeboardId The Id number of the leaderboard you want to display.
     */
    public static void showLeaderboard(int leaderboardId)
    {
                #if UNITY_ANDROID
                        #if !UNITY_EDITOR
        jvalue[] args = new jvalue[1];
        args[0].i = leaderboardId;

        AndroidJNI.CallStaticVoidMethod(swarmUnityInterface, showLeaderboardMethod, args);
                        #endif
                #endif
    }
Пример #30
0
    /**
     * Unlock an achievement using the achievement Id number and immediately show the achievements list
     *
     * @param achievementId The Id number of the achievement to unlock.
     */
    public static void unlockAchievementAndShowAchievements(int achievementID)
    {
                #if UNITY_ANDROID
                        #if !UNITY_EDITOR
        jvalue[] args = new jvalue[1];
        args[0].i = achievementID;

        AndroidJNI.CallStaticVoidMethod(swarmUnityInterface, unlockAndShowMethod, args);
                        #endif
                #endif
    }
Пример #31
0
        /// <summary>
        /// 从Asset中拷贝lua文件
        /// </summary>
        /// <param name="path">目录路径.</param>
        private void copyLuaFileFromAsset(string path)
        {
            AndroidJavaObject currentActivity = getCurrentActivity();
            AndroidJavaObject assetManager    = currentActivity.Call <AndroidJavaObject> ("getAssets", new object[0]);

            string[] subpaths = assetManager.Call <string[]> ("list", path);
            if (subpaths.Length > 0)
            {
                //当前path为目录
                foreach (string subpath in subpaths)
                {
                    copyLuaFileFromAsset(string.Format("{0}{1}/", path, subpath));
                }
            }
            else
            {
                //当前path为文件
                string fileName = path.Substring(0, path.Length - 1);
                if (fileName.ToLower().EndsWith(".lua"))
                {
                    //为lua文件,则进行拷贝
                    string destFilePath = getLuaCacheFilePath(fileName);

                    AndroidJavaObject inputStream = assetManager.Call <AndroidJavaObject>("open", fileName);
                    using (MemoryStream ms = new MemoryStream())
                    {
                        try
                        {
                            IntPtr   buffer = AndroidJNI.NewByteArray(1024);
                            jvalue[] args   = new jvalue[1];
                            args[0].l = buffer;

                            IntPtr readMethodId = AndroidJNIHelper.GetMethodID(inputStream.GetRawClass(), "read", "([B)I");
                            int    hasRead      = 0;
                            while ((hasRead = AndroidJNI.CallIntMethod(inputStream.GetRawObject(), readMethodId, args)) != -1)
                            {
                                byte[] byteArray = AndroidJNIHelper.ConvertFromJNIArray <byte[]>(buffer);
                                ms.Write(byteArray, 0, hasRead);
                            }

                            ms.Seek(0, SeekOrigin.Begin);
                            byte[] bytes = new byte[ms.Length];
                            ms.Read(bytes, 0, bytes.Length);

                            File.WriteAllBytes(destFilePath, bytes);
                        }
                        finally
                        {
                            ms.Close();
                        }
                    }
                }
            }
        }
Пример #32
0
 private static void BurstlyAdWrapper_createBannerPlacement(string placementName, string appId, string zoneId, float originX, float originY, float width, float height)
 {
     jvalue[] args = new jvalue[7];
     args[0].l = AndroidJNI.NewStringUTF(placementName);
     args[1].l = AndroidJNI.NewStringUTF(appId);
     args[2].l = AndroidJNI.NewStringUTF(zoneId);
     args[3].f = originX;
     args[4].f = originY;
     args[5].f = width;
     args[6].f = height;
     AndroidJNI.CallStaticVoidMethod(BurstlyPluginClass, methodID_createBannerPlacement, args);
 }
Пример #33
0
        public static jvalue GenerateJvalue(byte[] bin, int length)
        {
            jvalue arg = new jvalue();
            var    ptr = AndroidJNI.NewSByteArray(length);

            for (int i = 0; i < length; ++i)
            {
                AndroidJNI.SetSByteArrayElement(ptr, i, unchecked ((sbyte)bin[i]));
            }
            arg.l = ptr;
            return(arg);
        }
        public CacheInvalidatorCallback(ICacheInvalidator cacheInvalidator)
        {
            _invalidator = cacheInvalidator;
            _callback = new GenericCallback((out int return_type, out jvalue return_value, IntPtr input) =>
            {
                try
                {
                    string key = (string)JavaClass.GetTypedInstance(typeof(string), jvalue.From(input).l);
                    _invalidator.Invalidate(key);

                    return_value = new jvalue();
                    return_type = 0;
                }
                catch (Exception exception)
                {
                    return_value = jvalue.CreateCBRetVal(exception);
                    return_type = 1;
                }

                return 0;
            });

            base.JObject = _constructor.construct(0, _callback);
        }
Пример #35
0
		internal static jobject CallNonvirtualObjectMethodA(JNIEnv* pEnv, jobject obj, jclass clazz, jmethodID methodID, jvalue*  args)
		{
			return pEnv->MakeLocalRef(InvokeHelper(pEnv, obj, methodID, args, true));
		}
Пример #36
0
		internal static jlong CallLongMethodA(JNIEnv* pEnv, jobject obj, jmethodID methodID, jvalue* args)
		{
			object o = InvokeHelper(pEnv, obj, methodID, args, false);
			if(o != null)
			{
				return (jlong)(long)o;
			}
			return 0;
		}
Пример #37
0
		internal static void CallVoidMethodA(JNIEnv* pEnv, jobject obj, jmethodID methodID, jvalue*  args)
		{
			InvokeHelper(pEnv, obj, methodID, args, false);
		}
Пример #38
0
		internal static jchar CallCharMethodA(JNIEnv* pEnv, jobject obj, jmethodID methodID, jvalue* args)
		{
			object o = InvokeHelper(pEnv, obj, methodID, args, false);
			if(o != null)
			{
				return (jchar)(char)o;
			}
			return 0;
		}
Пример #39
0
		internal static jint CallIntMethodA(JNIEnv* pEnv, jobject obj, jmethodID methodID, jvalue* args)
		{
			object o = InvokeHelper(pEnv, obj, methodID, args, false);
			if(o != null)
			{
				return (jint)(int)o;
			}
			return 0;
		}
Пример #40
0
		public static char CallCharMethod(IntPtr obj, IntPtr methodID, jvalue[] args){}
Пример #41
0
		internal static jbyte CallByteMethodA(JNIEnv* pEnv, jobject obj, jmethodID methodID, jvalue* args)
		{
			object o = InvokeHelper(pEnv, obj, methodID, args, false);
			if(o != null)
			{
				return (jbyte)(byte)o;
			}
			return 0;
		}
Пример #42
0
		internal static jfloat CallStaticFloatMethodA(JNIEnv* pEnv, jclass clazz, jmethodID methodID, jvalue *args)
		{
			object o = InvokeHelper(pEnv, IntPtr.Zero, methodID, args, false);
			if(o != null)
			{
				return (jfloat)(float)o;
			}
			return 0;
		}
Пример #43
0
		internal static void CallStaticVoidMethodA(JNIEnv* pEnv, jclass cls, jmethodID methodID, jvalue * args)
		{
			InvokeHelper(pEnv, IntPtr.Zero, methodID, args, false);
		}
Пример #44
0
		internal static jdouble CallNonvirtualDoubleMethodA(JNIEnv* pEnv, jobject obj, jclass clazz, jmethodID methodID, jvalue* args)
		{
			object o = InvokeHelper(pEnv, obj, methodID, args, true);
			if(o != null)
			{
				return (jdouble)(double)o;
			}
			return 0;
		}
Пример #45
0
		internal static jobject CallStaticObjectMethodA(JNIEnv* pEnv, jclass clazz, jmethodID methodID, jvalue *args)
		{
			return pEnv->MakeLocalRef(InvokeHelper(pEnv, IntPtr.Zero, methodID, args, false));
		}
Пример #46
0
		public static void CallVoidMethod(IntPtr obj, IntPtr methodID, jvalue[] args){}
Пример #47
0
		public static short CallShortMethod(IntPtr obj, IntPtr methodID, jvalue[] args){}
Пример #48
0
		public static float CallFloatMethod(IntPtr obj, IntPtr methodID, jvalue[] args){}
Пример #49
0
		internal static jboolean CallNonvirtualBooleanMethodA(JNIEnv* pEnv, jobject obj, jclass clazz, jmethodID methodID, jvalue*  args)
		{
			object o = InvokeHelper(pEnv, obj, methodID, args, true);
			if(o != null)
			{
				return ((bool)o) ? JNI_TRUE : JNI_FALSE;
			}
			return JNI_FALSE;
		}
Пример #50
0
		public static long CallLongMethod(IntPtr obj, IntPtr methodID, jvalue[] args){}
Пример #51
0
		internal static jfloat CallNonvirtualFloatMethodA(JNIEnv* pEnv, jobject obj, jclass clazz, jmethodID methodID, jvalue* args)
		{
			object o = InvokeHelper(pEnv, obj, methodID, args, true);
			if(o != null)
			{
				return (jfloat)(float)o;
			}
			return 0;
		}
Пример #52
0
		public static byte CallByteMethod(IntPtr obj, IntPtr methodID, jvalue[] args){}
Пример #53
0
		internal static void CallNonvirtualVoidMethodA(JNIEnv* pEnv, jobject obj, jclass clazz, jmethodID methodID, jvalue* args)
		{
			InvokeHelper(pEnv, obj, methodID, args, true);
		}
		private static object InvokeHelper(JNIEnv* pEnv, jobject objHandle, jmethodID methodID, jvalue* pArgs, bool nonVirtual)
		{
			ManagedJNIEnv env = pEnv->GetManagedJNIEnv();
			object obj = UnwrapRef(env, objHandle);
			MethodWrapper mw = MethodWrapper.FromCookie(methodID);
			mw.Link();
			mw.ResolveMethod();
			TypeWrapper[] argTypes = mw.GetParameters();
			object[] args = new object[argTypes.Length + (mw.HasCallerID ? 1 : 0)];
			for (int i = 0; i < argTypes.Length; i++)
			{
				TypeWrapper type = argTypes[i];
				if (type == PrimitiveTypeWrapper.BOOLEAN)
					args[i] = pArgs[i].z != JNI_FALSE;
				else if (type == PrimitiveTypeWrapper.BYTE)
					args[i] = (byte)pArgs[i].b;
				else if (type == PrimitiveTypeWrapper.CHAR)
					args[i] = (char)pArgs[i].c;
				else if (type == PrimitiveTypeWrapper.SHORT)
					args[i] = pArgs[i].s;
				else if (type == PrimitiveTypeWrapper.INT)
					args[i] = pArgs[i].i;
				else if (type == PrimitiveTypeWrapper.LONG)
					args[i] = pArgs[i].j;
				else if (type == PrimitiveTypeWrapper.FLOAT)
					args[i] = pArgs[i].f;
				else if (type == PrimitiveTypeWrapper.DOUBLE)
					args[i] = pArgs[i].d;
				else
					args[i] = argTypes[i].GhostWrap(UnwrapRef(env, pArgs[i].l));
			}
			if (mw.HasCallerID)
			{
				args[args.Length - 1] = env.callerID;
			}
			try
			{
				if (nonVirtual && mw.RequiresNonVirtualDispatcher)
				{
					return InvokeNonVirtual(env, mw, obj, args);
				}
				if (mw.IsConstructor)
				{
					if (obj == null)
					{
						return mw.CreateInstance(args);
					}
					else
					{
						MethodBase mb = mw.GetMethod();
						if (mb.IsStatic)
						{
							// we're dealing with a constructor on a remapped type, if obj is supplied, it means
							// that we should call the constructor on an already existing instance, but that isn't
							// possible with remapped types
							throw new NotSupportedException(string.Format("Remapped type {0} doesn't support constructor invocation on an existing instance", mw.DeclaringType.Name));
						}
						else if (!mb.DeclaringType.IsInstanceOfType(obj))
						{
							// we're trying to initialize an existing instance of a remapped type
							throw new NotSupportedException("Unable to partially construct object of type " + obj.GetType().FullName + " to type " + mb.DeclaringType.FullName);
						}
					}
				}
				return mw.Invoke(obj, args);
			}
			catch (Exception x)
			{
				SetPendingException(pEnv, ikvm.runtime.Util.mapException(x));
				return null;
			}
		}
Пример #55
0
		internal static jboolean CallStaticBooleanMethodA(JNIEnv* pEnv, jclass clazz, jmethodID methodID, jvalue *args)
		{
			object o = InvokeHelper(pEnv, IntPtr.Zero, methodID, args, false);
			if(o != null)
			{
				return ((bool)o) ? JNI_TRUE : JNI_FALSE;
			}
			return JNI_FALSE;
		}
Пример #56
0
		private static object InvokeHelper(JNIEnv* pEnv, jobject obj, jmethodID methodID, jvalue *args, bool nonVirtual)
		{
			ManagedJNIEnv env = pEnv->GetManagedJNIEnv();
			MethodWrapper mw = MethodWrapper.FromCookie(methodID);
			TypeWrapper[] argTypes = mw.GetParameters();
			object[] argarray = new object[argTypes.Length];
			for (int i = 0; i < argarray.Length; i++)
			{
				TypeWrapper type = argTypes[i];
				if (type == PrimitiveTypeWrapper.BOOLEAN)
					argarray[i] = java.lang.Boolean.valueOf(args[i].z != JNI_FALSE);
				else if (type == PrimitiveTypeWrapper.BYTE)
					argarray[i] = java.lang.Byte.valueOf((byte)args[i].b);
				else if (type == PrimitiveTypeWrapper.CHAR)
					argarray[i] = java.lang.Character.valueOf((char)args[i].c);
				else if (type == PrimitiveTypeWrapper.SHORT)
					argarray[i] = java.lang.Short.valueOf(args[i].s);
				else if (type == PrimitiveTypeWrapper.INT)
					argarray[i] = java.lang.Integer.valueOf(args[i].i);
				else if (type == PrimitiveTypeWrapper.LONG)
					argarray[i] = java.lang.Long.valueOf(args[i].j);
				else if (type == PrimitiveTypeWrapper.FLOAT)
					argarray[i] = java.lang.Float.valueOf(args[i].f);
				else if (type == PrimitiveTypeWrapper.DOUBLE)
					argarray[i] = java.lang.Double.valueOf(args[i].d);
				else
					argarray[i] = UnwrapRef(env, args[i].l);
			}
			try
			{
				return mw.InvokeJNI(UnwrapRef(env, obj), argarray, nonVirtual, env.callerID);
			}
			catch(java.lang.reflect.InvocationTargetException x)
			{
				SetPendingException(pEnv, ikvm.runtime.Util.mapException(x.getCause()));
				return null;
			}
			catch(Exception x)
			{
				SetPendingException(pEnv, ikvm.runtime.Util.mapException(x));
				return null;
			}
		}
Пример #57
0
		internal static jdouble CallStaticDoubleMethodA(JNIEnv* pEnv, jclass clazz, jmethodID methodID, jvalue *args)
		{
			object o = InvokeHelper(pEnv, IntPtr.Zero, methodID, args, false);
			if(o != null)
			{
				return (jdouble)(double)o;
			}
			return 0;
		}
Пример #58
0
		internal static jobject NewObjectA(JNIEnv* pEnv, jclass clazz, jmethodID methodID, jvalue *args)
		{
			TypeWrapper wrapper = TypeWrapper.FromClass((java.lang.Class)pEnv->UnwrapRef(clazz));
			if(!wrapper.IsAbstract && wrapper.TypeAsBaseType.IsAbstract)
			{
				// static newinstance helper method
				return pEnv->MakeLocalRef(InvokeHelper(pEnv, IntPtr.Zero, methodID, args, false));
			}
			jobject obj = AllocObjectImpl(pEnv, wrapper);
			if(obj != IntPtr.Zero)
			{
				InvokeHelper(pEnv, obj, methodID, args, false);
				if(ExceptionCheck(pEnv) == JNI_TRUE)
				{
					DeleteLocalRef(pEnv, obj);
					obj = IntPtr.Zero;
				}
			}
			return obj;
		}
Пример #59
0
 internal static jobject CallObjectMethodA(JNIEnv* pEnv, jobject obj, jmethodID methodID, jvalue* args)
 {
     return pEnv->MakeLocalRef(InvokeHelper(pEnv, obj, methodID, args, false));
 }
Пример #60
0
		public static double CallDoubleMethod(IntPtr obj, IntPtr methodID, jvalue[] args){}