예제 #1
0
    public void InitPlugin()
    {
        unityClass  = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        pluginClass = new AndroidJavaClass("com.TL.openfile.FileOpener");

        instancePtr = AndroidJNI.CallStaticObjectMethod(pluginClass.GetRawClass(), AndroidJNI.GetStaticMethodID(pluginClass.GetRawClass(), "instance",
                                                                                                                "()Lcom/TL/openfile/FileOpener;"), new jvalue[] { });

        // currentActivityPtr = AndroidJNI.GetStaticObjectField
        // (
        //  unityClass.GetRawClass(), AndroidJNI.GetStaticFieldID
        //  (
        //      unityClass.GetRawClass(), "currentActivity", "Landroid/app/Activity;"
        //  )
        // );

        downloadDirectory = AndroidJNI.CallStaticStringMethod
                            (
            instancePtr, AndroidJNI.GetMethodID
            (
                pluginClass.GetRawClass(), "GetDownloadDirectory", "()Ljava/lang/String;"
            ),
            new jvalue[]
        {
        }
                            );
        print("DownloadDirectory " + downloadDirectory);
        downloadDirectory = "/storage/emulated/0/";
        print("DownloadDirectory " + downloadDirectory);
    }
        public static void CheckException()
        {
            IntPtr localref = AndroidJNI.ExceptionOccurred();

            if (!(localref != IntPtr.Zero))
            {
                return;
            }
            AndroidJNI.ExceptionClear();
            IntPtr class1 = AndroidJNI.FindClass("java/lang/Throwable");
            IntPtr class2 = AndroidJNI.FindClass("android/util/Log");

            try {
                IntPtr methodId       = AndroidJNI.GetMethodID(class1, "toString", "()Ljava/lang/String;");
                IntPtr staticmethodId = AndroidJNI.GetStaticMethodID(class2, "getStackTraceString", "(Ljava/lang/Throwable;)Ljava/lang/String;");
                string message        = AndroidJNI.CallStringMethod(localref, methodId, new jvalue[0]);

                jvalue[] args = new jvalue[1];
                args[0].l = localref;

                string javaStackTrace = AndroidJNI.CallStaticStringMethod(class2, staticmethodId, args);
                throw new AndroidJavaException(message, javaStackTrace);
            }
            finally {
                DeleteLocalRef(localref);
                DeleteLocalRef(class1);
                DeleteLocalRef(class2);
            }
        }
예제 #3
0
        private void AndroidJNISafeCheckException()
        {
            IntPtr intPtr = AndroidJNI.ExceptionOccurred();

            if (intPtr != IntPtr.Zero)
            {
                AndroidJNI.ExceptionClear();
                IntPtr intPtr2 = AndroidJNI.FindClass("java/lang/Throwable");
                IntPtr intPtr3 = AndroidJNI.FindClass("android/util/Log");
                try
                {
                    IntPtr   methodID       = AndroidJNI.GetMethodID(intPtr2, "toString", "()Ljava/lang/String;");
                    IntPtr   staticMethodID = AndroidJNI.GetStaticMethodID(intPtr3, "getStackTraceString", "(Ljava/lang/Throwable;)Ljava/lang/String;");
                    string   message        = AndroidJNI.CallStringMethod(intPtr, methodID, new jvalue[0]);
                    jvalue[] array          = new jvalue[1];
                    array [0].l = intPtr;
                    string javaStackTrace = AndroidJNI.CallStaticStringMethod(intPtr3, staticMethodID, array);
                    throw new AndroidJavaException(message, javaStackTrace);
                }
                finally
                {
                    AndroidJNISafeDeleteLocalRef(intPtr);
                    AndroidJNISafeDeleteLocalRef(intPtr2);
                    AndroidJNISafeDeleteLocalRef(intPtr3);
                }
            }
        }
예제 #4
0
    public static void GetApps()
    {
        IntPtr clas = AndroidJNI.FindClass("MakeImageCache");

        clas = AndroidJNI.NewGlobalRef(clas);

        IntPtr funcID = AndroidJNI.GetMethodID(clas, "getApps", "()V");

        AndroidJNI.CallStaticVoidMethod(clas, funcID, null);

        IntPtr nameID = AndroidJNI.GetMethodID(clas, "getName", "(I)Ljava/lang/String;");

        nameID = AndroidJNI.NewGlobalRef(nameID);

        IntPtr length = AndroidJNI.GetMethodID(clas, "getTotalApps", "()I");

        length = AndroidJNI.NewGlobalRef(length);
        int j = AndroidJNI.CallIntMethod(clas, length, null);

        Debug.Log("hehehe " + j);

        jvalue[] val = new jvalue[1];
        val[0] = new jvalue();

        Debug.Log("loading apps ...");

        for (int i = 0; i < j; i++)
        {
            val[0].i = i;
            Debug.Log("hehehe");
            Debug.Log(AndroidJNI.CallStaticStringMethod(clas, nameID, val));
        }

        Debug.Log("loaded apps!");
    }
예제 #5
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);
    }
예제 #6
0
        public static T StaticInvokeCall <T>(string type, string name, string sig, params object[] args)
        {
            Type   t        = typeof(T);
            IntPtr rawClass = AndroidJNI.FindClass(type);
            IntPtr method   = AndroidJNI.GetStaticMethodID(rawClass, name, sig);

            jvalue[] jArgs = ConstructArgArray(args);

            if (t == typeof(bool))
            {
                return((T)(object)AndroidJNI.CallStaticBooleanMethod(
                           rawClass, method, jArgs));
            }
            else if (t == typeof(string))
            {
                return((T)(object)AndroidJNI.CallStaticStringMethod(
                           rawClass, method, jArgs));
            }
            else if (t == typeof(int))
            {
                return((T)(object)AndroidJNI.CallStaticIntMethod(
                           rawClass, method, jArgs));
            }
            else if (t == typeof(float))
            {
                return((T)(object)AndroidJNI.CallStaticFloatMethod(
                           rawClass, method, jArgs));
            }
            else if (t == typeof(double))
            {
                return((T)(object)AndroidJNI.CallStaticDoubleMethod(
                           rawClass, method, jArgs));
            }
            else if (t == typeof(byte))
            {
                return((T)(object)AndroidJNI.CallStaticByteMethod(
                           rawClass, method, jArgs));
            }
            else if (t == typeof(char))
            {
                return((T)(object)AndroidJNI.CallStaticCharMethod(
                           rawClass, method, jArgs));
            }
            else if (t == typeof(long))
            {
                return((T)(object)AndroidJNI.CallStaticLongMethod(
                           rawClass, method, jArgs));
            }
            else if (t == typeof(short))
            {
                return((T)(object)AndroidJNI.CallStaticShortMethod(
                           rawClass, method, jArgs));
            }
            else
            {
                return(StaticInvokeObjectCall <T>(type, name, sig, args));
            }
        }
 public static string CallStaticStringMethod(IntPtr clazz, IntPtr methodId, jvalue[] args)
 {
     try {
         return(AndroidJNI.CallStaticStringMethod(clazz, methodId, args));
     }
     finally {
         CheckException();
     }
 }
예제 #8
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);
    }
예제 #9
0
        public static T StaticInvokeCall <T>(string type, string name, string sig, params object[] args)
        {
            T      local;
            Type   type2    = typeof(T);
            IntPtr clazz    = AndroidJNI.FindClass(type);
            IntPtr methodID = AndroidJNI.GetStaticMethodID(clazz, name, sig);

            jvalue[] jvalueArray = ConstructArgArray(args);
            try
            {
                if (type2 == typeof(bool))
                {
                    return((T)AndroidJNI.CallStaticBooleanMethod(clazz, methodID, jvalueArray));
                }
                if (type2 == typeof(string))
                {
                    return((T)AndroidJNI.CallStaticStringMethod(clazz, methodID, jvalueArray));
                }
                if (type2 == typeof(int))
                {
                    return((T)AndroidJNI.CallStaticIntMethod(clazz, methodID, jvalueArray));
                }
                if (type2 == typeof(float))
                {
                    return((T)AndroidJNI.CallStaticFloatMethod(clazz, methodID, jvalueArray));
                }
                if (type2 == typeof(double))
                {
                    return((T)AndroidJNI.CallStaticDoubleMethod(clazz, methodID, jvalueArray));
                }
                if (type2 == typeof(byte))
                {
                    return((T)AndroidJNI.CallStaticByteMethod(clazz, methodID, jvalueArray));
                }
                if (type2 == typeof(char))
                {
                    return((T)AndroidJNI.CallStaticCharMethod(clazz, methodID, jvalueArray));
                }
                if (type2 == typeof(long))
                {
                    return((T)AndroidJNI.CallStaticLongMethod(clazz, methodID, jvalueArray));
                }
                if (type2 == typeof(short))
                {
                    return((T)AndroidJNI.CallStaticShortMethod(clazz, methodID, jvalueArray));
                }
                local = StaticInvokeObjectCall <T>(type, name, sig, args);
            }
            finally
            {
                AndroidJNIHelper.DeleteJNIArgArray(args, jvalueArray);
            }
            return(local);
        }
예제 #10
0
    public string GetAppName()
    {
        IntPtr methodid = AndroidJNIHelper.GetMethodID(classId, "getAppName", "()Ljava/lang/String", true);

        if (methodid != IntPtr.Zero)
        {
            string ret = AndroidJNI.CallStaticStringMethod(classId, methodid, null);
            return(ret);
        }
        return("");
    }
예제 #11
0
    /*
     * Get the username of the currently logged in user.
     */
    public static string getUsername()
    {
                #if UNITY_ANDROID
                        #if !UNITY_EDITOR
        jvalue[] args = new jvalue[0];

        return(AndroidJNI.CallStaticStringMethod(swarmUnityInterface, getUsernameMethod, args));
                        #endif
                #endif

        return("");
    }
예제 #12
0
    public static string JNICallString(string classPath, string methodName, params object[] parameters)
    {
        string signature;

        jvalue[] args;
        PrepareJNI(parameters, out args, "Ljava/lang/String;", out signature);

        IntPtr clsPtr    = AndroidJNI.FindClass(classPath);
        IntPtr methodPtr = AndroidJNI.GetStaticMethodID(clsPtr, methodName, signature);

        Debug.Log("Calling JNI string method " + classPath + "." + methodName + ", signature: " + signature);
        return(AndroidJNI.CallStaticStringMethod(clsPtr, methodPtr, args));
    }
    void Start()
    {
        btn1.onClick.AddListener(() =>
        {
            //通过对象调用非静态接口-----------------------------------------------------------------

            //获得类
            IntPtr clz = AndroidJNI.FindClass("com/unity3d/player/UnityPlayer");
            IntPtr fid = AndroidJNI.GetStaticFieldID(clz, "currentActivity", "Landroid/app/Activity;");
            //获得静态属性
            IntPtr obj = AndroidJNI.GetStaticObjectField(clz, fid);
            //获得类
            IntPtr clz_OurAppActitvityClass = AndroidJNI.FindClass("com/linxinfa/game/MyActivity");
            //获得方法
            IntPtr methodId = AndroidJNI.GetMethodID(clz_OurAppActitvityClass, "HelloMethod", "(Ljava/lang/String;)Ljava/lang/String;");

            //参数
            jvalue v = new jvalue();
            v.l      = AndroidJNI.NewStringUTF("I am Unity");

            var result = AndroidJNI.CallStringMethod(obj, methodId, new jvalue[] { v });
            txt.text   = result;

            AndroidJNI.DeleteLocalRef(clz);
            AndroidJNI.DeleteLocalRef(fid);
            AndroidJNI.DeleteLocalRef(obj);
            AndroidJNI.DeleteLocalRef(clz_OurAppActitvityClass);
            AndroidJNI.DeleteLocalRef(methodId);
        });

        btn2.onClick.AddListener(() =>
        {
            //通过类调用静态接口----------------------------------------------------------------------------
            //获得类
            IntPtr clz = AndroidJNI.FindClass("com/linxinfa/game/MyActivity");
            //调用静态方法
            IntPtr methodId = AndroidJNI.GetStaticMethodID(clz, "HelloStaticMethod", "(II)Ljava/lang/String;");
            //参数
            jvalue v1  = new jvalue();
            v1.i       = 10;
            jvalue v2  = new jvalue();
            v2.i       = 15;
            var result = AndroidJNI.CallStaticStringMethod(clz, methodId, new jvalue[] { v1, v2 });

            txt.text = result;

            AndroidJNI.DeleteLocalRef(clz);
            AndroidJNI.DeleteLocalRef(methodId);
        });
    }
예제 #14
0
        private string AndroidJNISafeCallStaticStringMethod(IntPtr clazz, IntPtr methodID, jvalue[] args)
        {
            string result;

            try
            {
                result = AndroidJNI.CallStaticStringMethod(clazz, methodID, args);
            }
            finally
            {
                AndroidJNISafeCheckException();
            }
            return(result);
        }
예제 #15
0
    public static string GetAndroidSDCardRoot()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        try
        {
            string sig  = AndroidJNIHelper.GetSignature <string>(new object[0]);
            var    ptr  = AndroidJNI.GetStaticMethodID(GamePluginMgrPtr, "GetSdCardRoot", sig);
            string path = AndroidJNI.CallStaticStringMethod(GamePluginMgrPtr, ptr, new jvalue[0]);
            return(path);
        }
        catch (Exception exception)
        {
            //ssLogger.Log(exception.Message);
        }
#endif
        return(null);
    }
        public static T StaticInvokeCall <T>(string type, string name, string sig, params object[] args)
        {
            Type   typeFromHandle = typeof(T);
            IntPtr intPtr         = AndroidJNI.FindClass(type);
            IntPtr staticMethodID = AndroidJNI.GetStaticMethodID(intPtr, name, sig);

            jvalue[] array = ConstructArgArray(args);
            if (typeFromHandle == typeof(bool))
            {
                return((T)(object)AndroidJNI.CallStaticBooleanMethod(intPtr, staticMethodID, array));
            }
            if (typeFromHandle == typeof(string))
            {
                return((T)(object)AndroidJNI.CallStaticStringMethod(intPtr, staticMethodID, array));
            }
            if (typeFromHandle == typeof(int))
            {
                return((T)(object)AndroidJNI.CallStaticIntMethod(intPtr, staticMethodID, array));
            }
            if (typeFromHandle == typeof(float))
            {
                return((T)(object)AndroidJNI.CallStaticFloatMethod(intPtr, staticMethodID, array));
            }
            if (typeFromHandle == typeof(double))
            {
                return((T)(object)AndroidJNI.CallStaticDoubleMethod(intPtr, staticMethodID, array));
            }
            if (typeFromHandle == typeof(byte))
            {
                return((T)(object)AndroidJNI.CallStaticByteMethod(intPtr, staticMethodID, array));
            }
            if (typeFromHandle == typeof(char))
            {
                return((T)(object)AndroidJNI.CallStaticCharMethod(intPtr, staticMethodID, array));
            }
            if (typeFromHandle == typeof(long))
            {
                return((T)(object)AndroidJNI.CallStaticLongMethod(intPtr, staticMethodID, array));
            }
            if (typeFromHandle == typeof(short))
            {
                return((T)(object)AndroidJNI.CallStaticShortMethod(intPtr, staticMethodID, array));
            }
            return(StaticInvokeObjectCall <T>(type, name, sig, args));
        }
예제 #17
0
        public static T StaticInvokeCall <T>(string type, string name, string sig, params object[] args)
        {
            Type   type1          = typeof(T);
            IntPtr num            = AndroidJNI.FindClass(type);
            IntPtr staticMethodId = AndroidJNI.GetStaticMethodID(num, name, sig);

            jvalue[] jvalueArray = JavaObjWrapper.ConstructArgArray(args);
            if ((object)type1 == (object)typeof(bool))
            {
                return((T)(ValueType)AndroidJNI.CallStaticBooleanMethod(num, staticMethodId, jvalueArray));
            }
            if ((object)type1 == (object)typeof(string))
            {
                return((T)AndroidJNI.CallStaticStringMethod(num, staticMethodId, jvalueArray));
            }
            if ((object)type1 == (object)typeof(int))
            {
                return((T)(ValueType)AndroidJNI.CallStaticIntMethod(num, staticMethodId, jvalueArray));
            }
            if ((object)type1 == (object)typeof(float))
            {
                return((T)(ValueType)AndroidJNI.CallStaticFloatMethod(num, staticMethodId, jvalueArray));
            }
            if ((object)type1 == (object)typeof(double))
            {
                return((T)(ValueType)AndroidJNI.CallStaticDoubleMethod(num, staticMethodId, jvalueArray));
            }
            if ((object)type1 == (object)typeof(byte))
            {
                return((T)(ValueType)AndroidJNI.CallStaticByteMethod(num, staticMethodId, jvalueArray));
            }
            if ((object)type1 == (object)typeof(char))
            {
                return((T)(ValueType)AndroidJNI.CallStaticCharMethod(num, staticMethodId, jvalueArray));
            }
            if ((object)type1 == (object)typeof(long))
            {
                return((T)(ValueType)AndroidJNI.CallStaticLongMethod(num, staticMethodId, jvalueArray));
            }
            if ((object)type1 == (object)typeof(short))
            {
                return((T)(ValueType)AndroidJNI.CallStaticShortMethod(num, staticMethodId, jvalueArray));
            }
            return(JavaObjWrapper.StaticInvokeObjectCall <T>(type, name, sig, args));
        }
예제 #18
0
파일: Capture.cs 프로젝트: LoisMonet/GARnie
    void Start()
    {
        if (!Application.isEditor)
        {
            // First, obtain the current activity context
            using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            {
                playerActivityContext = jc.GetStatic <AndroidJavaObject>("currentActivity");
            }

            // Search for our class
            IntPtr classID = AndroidJNI.FindClass("com/intel/inde/mp/samples/unity/Capturing"); // com.intel.inde.mp.samples.unity // com/intel/penelope/Capturing

            // Search for it's contructor
            constructorMethodID = AndroidJNI.GetMethodID(classID, "<init>", "(Landroid/content/Context;II)V");
            if (constructorMethodID == IntPtr.Zero)
            {
                Debug.LogError("Can't find Capturing constructor.");
                return;
            }

            // Register our methods
            initCapturingMethodID = AndroidJNI.GetMethodID(classID, "initCapturing", "(IIII)V");
            if (initCapturingMethodID == IntPtr.Zero)
            {
                Debug.LogError("Can't find initCapturing() method.");
                return;
            }
            startCapturingMethodID = AndroidJNI.GetMethodID(classID, "startCapturing", "(Ljava/lang/String;)V");
            if (startCapturingMethodID == IntPtr.Zero)
            {
                Debug.LogError("Can't find startCapturing() method.");
                return;
            }
            captureFrameMethodID = AndroidJNI.GetMethodID(classID, "captureFrame", "(I)V");
            if (captureFrameMethodID == IntPtr.Zero)
            {
                Debug.LogError("Can't find captureFrame() method.");
                return;
            }
            stopCapturingMethodID = AndroidJNI.GetMethodID(classID, "stopCapturing", "()V");
            if (stopCapturingMethodID == IntPtr.Zero)
            {
                Debug.LogError("Can't find stopCapturingMethodID() method.");
                return;
            }

            // Register and call our static method
            getDirectoryDCIMMethodID = AndroidJNI.GetStaticMethodID(classID, "getDirectoryDCIM", "()Ljava/lang/String;");
            jvalue[] args = new jvalue[0];
            videoDir = AndroidJNI.CallStaticStringMethod(classID, getDirectoryDCIMMethodID, args);

            // Create Capturing object
            jvalue[] constructorParameters = AndroidJNIHelper.CreateJNIArgArray(new object[] {
                playerActivityContext, Screen.width, Screen.height
            });
            IntPtr local_capturingObject = AndroidJNI.NewObject(classID, constructorMethodID, constructorParameters);
            if (local_capturingObject == IntPtr.Zero)
            {
                Debug.LogError("--- Can't create Capturing object.");
                return;
            }
            // Keep a global reference to it
            capturingObject = AndroidJNI.NewGlobalRef(local_capturingObject);
            AndroidJNI.DeleteLocalRef(local_capturingObject);

            AndroidJNI.DeleteLocalRef(classID);
        }
        isRunning = false;
        Debug.Log("--- videoFrameRate = " + videoFrameRate);
        Debug.Log("--- 1.0f / videoFrameRate = " + 1.0f / videoFrameRate);
    }
예제 #19
0
 static string AndroidGetCustomID()
 {
     jvalue[] args = new jvalue[0];
     return(AndroidJNI.CallStaticStringMethod(class_UnityADC, method_getCustomID, args));
 }
예제 #20
0
 static string AndroidStatusForZone(string zone_id)
 {
     jvalue[] args = new jvalue[1];
     args[0].l = AndroidJNI.NewStringUTF(zone_id);
     return(AndroidJNI.CallStaticStringMethod(class_UnityADC, method_statusForZone, args));
 }
예제 #21
0
 public static string GetDeviceID()
 {
     jvalue[] args = new jvalue[0];
     return(AndroidJNI.CallStaticStringMethod(class_UnityADC, method_getDeviceID, args));
 }