Вызывать нестати c методы на пользовательских плагинах Unity Android - PullRequest
8 голосов
/ 24 февраля 2020

Я пытаюсь понять, как создать свои собственные Android плагины для Android.

Я добиваюсь вызова методов stati c для моего класса Java (созданного в AndroidStudio ), но я действительно не могу вызывать нестати c методы.

Я проверяю эти ссылки:

Но ни один не работает.

Я пытаюсь получить звонок от кнопки из Unity, например:

AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.Get<AndroidJavaObject>("currentActivity");
currentActivity.Call("SayHi");

И моя активность на Android выглядит следующим образом:

public class MainActivity extends UnityPlayerActivity {
    private static final String TAG = "LibraryTest";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "Created!");
    }

    public void SayHi()
    {
        Log.d(TAG, "HI_");
    }
}

Мой АБР выдает это сообщение: enter image description here

Я также пытался звонить вместо вызова UnityPlayer это как:

AndroidJavaClass pluginClass = new AndroidJavaClass("com.example.eric.librarytest.MainActivity");

РЕДАКТИРОВАТЬ: Это мой AndroidManifest. xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.eric.librarytest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="24"
        android:targetSdkVersion="28" />

    <application android:label="@string/app_name" >
        <activity
            android:name="com.example.eric.librarytest.MainActivity"
            android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Но не работает ни для non-stati c методы, это работает только для stati c методов, если я делаю pluginClass.CallStatic(""), любая идея?

EDIT 2:

  • Тарас Лескив предлагаем изменить UnityPlayer.Get на UnityPlayer.GetStati c, но затем я получаю следующую ошибку:

    ошибка: java .lang.NoSuchMethodError: нет не-Stati c метод с именем = 'SayHi' signature = '() V' в классе L java .lang.Object;

  • Proguard не активен.

Ответы [ 4 ]

1 голос
/ 26 февраля 2020

Когда вы делаете это:

AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.Get<AndroidJavaObject>("currentActivity");
currentActivity.Call("SayHi");

Это не работает, потому что поле currentActivity - это stati c, что вы должны сделать:

AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
currentActivity.Call("SayHi");

Обратите внимание на UnityPlayer.GetStati c part

Вот еще один удобный фрагмент из одного из моих плагинов:

    static AndroidJavaObject _activity;

    public static AndroidJavaObject Activity
    {
        get
        {
            if (_activity == null)
            {
                var unityPlayer = new AndroidJavaClass(C.ComUnity3DPlayerUnityPlayer);
                _activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            }
            return _activity;
        }
    }
0 голосов
/ 16 марта 2020

Мой код был верным, проблема заключалась в структуре проекта.

Мой проект был похож на

Assets
├── Plugins
│   ├── classes.jar

И должен выглядеть так:

Assets
├── Plugins
│   ├── Android
│   │   ├── classes.jar

Был obvius (не для меня) вызывает ошибку спамом сообщение, которое не может найти подпись, поэтому программное обеспечение не может прочитать эти классы.

0 голосов
/ 03 марта 2020

Все, что вам нужно сделать, это объявить свой собственный контекст stati c в классе активности:

public class MainActivity extends UnityPlayerActivity {
    private static final String TAG = "LibraryTest";
    public static Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        Log.d(TAG, "Created!");
    }

    public void SayHi()
    {
        Log.d(TAG, "HI_");
    }
}

И затем просто вызвать любой нестатический метод c из C# следующим образом:

public static void AndroidCallFunction()
{
    using (AndroidJavaClass javaClass = new AndroidJavaClass("com.example.eric.librarytest.MainActivity"))
    {
        using (AndroidJavaObject activity = javaClass.GetStatic<AndroidJavaObject>("mContext"))
        {
            activity.Call("SayHi");
        }
    }
}

Существует NO других методов для вызова методов непосредственно из java кода. Вы можете реализовать свою собственную систему обмена сообщениями, используя команды AndroidJavaProxy и Broadcast, даже не предпринимая никаких действий, но это другой вопрос.

0 голосов
/ 25 февраля 2020

Возможно, это связано с java наследованием: ваш текущий AndroidJavaObject имеет класс com.unity3d.player.UnityPlayer, но у этого класса нет SayHi метода, вы должны привести ваш объект к MainActivity перед вызовом вашего метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...