Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更改Unity Android插件包名称_Java_Android_Plugins_Jar_Unity3d - Fatal编程技术网

Java 如何更改Unity Android插件包名称

Java 如何更改Unity Android插件包名称,java,android,plugins,jar,unity3d,Java,Android,Plugins,Jar,Unity3d,我通过扩展UnityPlayerActivity来制作我的第一个Android插件。包的名称是com.inno.myPlugin,该名称在Plugins/Android文件夹的Manifest.xml中注册 扩展的类是“MyClass”com.inno.myPlugin” 该插件编译为.jar文件,在Unity端使用“AndroidJavaClass”和“AndroidJavaObject”调用函数,并放置在插件/Android文件夹中 每次我在android设备上编译我的示例时,应用程序包名总

我通过扩展UnityPlayerActivity来制作我的第一个Android插件。包的名称是com.inno.myPlugin,该名称在Plugins/Android文件夹的Manifest.xml中注册

扩展的类是“MyClasscom.inno.myPlugin

该插件编译为.jar文件,在Unity端使用“AndroidJavaClass”和“AndroidJavaObject”调用函数,并放置在插件/Android文件夹中

每次我在android设备上编译我的示例时,应用程序包名总是“com.inno.myPlugin”。即使我从Unity settings更改包名,默认包名仍然是jar插件的包名,即“com.inno.myPlugin”。包名只能从jar文件的源代码重命名

我想插件发布到Unity Asset store,但我有一个问题困扰着我

如果软件包名“com.inno.myPlugin”已经在Android应用商店中使用了,这是否会阻止我的插件用户使用此插件上传应用程序


我如何解决包命名的问题?

这是Unity Android插件的一个较大问题

这里有一些可能性。使用下面的答案获得正确答案

a) 您的插件是否要求主活动(即启动器活动)为“com.inno.myPlugin.MyClass”

b) 您是否在MyClass中重写OnActivityResult

c) 以上两者都不是

如果您对(a)的回答是肯定的,那么除了您自己之外,任何人都不可能使用此插件,原因有很多,从其他人无法调整您的代码到相互冲突的软件包

如果你对(b)的回答是肯定的,那么其他人很有可能使用它,但是如果另一个插件也需要该特权,他们就不能使用它

如果你对(c)的回答是肯定的,那么你应该表现得很好

最简单的测试方法是在一个新项目中使用插件,使用不同的包名,然后检查它是否有效

另外,我建议您不要扩展UnityPlayerActivity。扩展UnityPlayerActivity的唯一原因是

  • 获取currentActivity(即UnityPlayer.currentActivity)
  • 使用unitySendMessage的步骤
  • 您可以使用反射来获得这两个。currentActivity是一个字段,unitySendMessage是一个方法。我不会在这里详细讨论,因为它与您的问题没有直接关系,但是如果您需要一些细节,请随时ping


    编辑根据OP的要求添加一些示例代码

    下面是一个示例插件,我没有扩展UnityPlayerActivity或UnityPlayerActiveActivity。注意,我刚刚在这里直接输入了这个,所以代码中可能有错误。我可以肯定的是,本机代码需要try-catch块,但是在粘贴代码时,任何IDE都应该显示错误

    本地Android代码

    package com.myCompany.myProduct;
    
    public class MyClass {
        private Class<?> unityPlayerClass;
        private Field unityCurrentActivity;
        private Method unitySendMessage;
    
        public void init () {
    
            //Get the UnityPlayer class using Reflection
            unityPlayerClass = Class.forName("com.unity3d.player.UnityPlayer");
            //Get the currentActivity field
            unityCurrentActivity= unityPlayerClass.getField("currentActivity");
            //Get the UnitySendMessage method
            unitySendMessage = unityPlayerClass.getMethod("UnitySendMessage", new Class [] { String.class, String.class, String.class } );
        }
    
        //Use this method to get UnityPlayer.currentActivity
        public Activity currentActivity () {
    
            Activity activity = (Activity) unityCurrentActivity.get(unityPlayerClass);
            return activity;            
        }
    
    
        public void unitySendMessageInvoke (String gameObject, String methodName, String param) {
            //Invoke the UnitySendMessage Method
            unitySendMessage.invoke(null, new Object[] { gameObject, methodName, param} );
        }
    
        public void makeToast (final String toastText, final int duration) {
            currentActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getActivity(), toastText, duration).show();
                }
            });
        }
    }
    
    AndroidJavaObject myClass = null;
    
    public void Init () {
        if(myClass == null)
            myClass = new AndroidJavaObject("com.myCompany.myProduct.MyClass");
    
        if(myClass != null)
            myClass.Call("init", new object[0]);
    }
    
    
    public void MakeToast (string toastText, int duration) {
        if(myClass != null)
            myClass.Call("makeToast", new object[] { toastText, duration } );
    }
    


    对于清单,将其更改为您要调用的包名称。请注意,它不必与插件的包匹配!例如,这里我们插件的包名是“com.myCompany.myProduct”,您可以使用类似“com.someOtherCompany.someNewProduct”的包名



    如何测试此插件。
    1.将上面的本机代码添加到“MyClass.java”中,并创建一个jar。
    2.将此jar复制到Unity项目的Assets/Plugins/Android文件夹中。
    3.确保包名称不是Unity中的默认包名称
    4.将上面的Unity C#代码复制到新脚本中
    5.输入一些OnGUI代码来调用C#中的“Init”和“MakeToast”方法


    来源-我为Unity制作插件的专业知识。

    谢谢回复。关于你的回答我有几个问题。我的类名是MyClass扩展的UnityPlayerActivity。如果我不扩展UnityPlayerActiveActivity,我能在C端使用AndroidJavaObject.call调用java函数吗?我还能够使用UnityPlayer.UnitySendMessage(arg0、arg1、arg2)在C端调用函数吗?我的清单文件应该是什么样子?目前,清单中我的主要类是MyClass。我应该把它去掉吗?有很多问题要回答。我怀疑我能否在评论中回答他们,所以我将编辑我的答案。我很快会把东西放在这里。