在自定义 Unity Android 插件上调用非静态方法

Lot*_*tan 8 c# java plugins android unity-game-engine

我试图了解如何为 Android 构建我自己的 Android 插件。

我实现了在我的 Java 类(在 AndroidStudio 上创建的)上调用静态方法,但我真的不能调用非静态方法。

我检查这些链接:

但没有一个有效。

我正在尝试从 Unity 的按钮中获取呼叫,例如:

AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.Get<AndroidJavaObject>("currentActivity");
currentActivity.Call("SayHi");
Run Code Online (Sandbox Code Playgroud)

我在 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_");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的亚行正在抛出这条消息: 在此处输入图片说明

我也试过调用而不是 UnityPlayer 调用它:

AndroidJavaClass pluginClass = new AndroidJavaClass("com.example.eric.librarytest.MainActivity");
Run Code Online (Sandbox Code Playgroud)

编辑: 这是我的 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>
Run Code Online (Sandbox Code Playgroud)

但是对于非静态方法也不起作用,如果我这样做pluginClass.CallStatic(""),它只适用于静态方法,知道吗?

编辑2:

  • Taras Leskiv 建议将 UnityPlayer.Get 更改为 UnityPlayer.GetStatic,但随后出现以下错误:

    错误:java.lang.NoSuchMethodError:在类 Ljava.lang.Object 中没有 name='SayHi' 签名 ='()V' 的非静态方法;

  • Proguard 不活跃。

Lot*_*tan 0

我的代码是正确的,问题在于项目结构。

\n\n

我的项目是这样的:

\n\n
Assets\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Plugins\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 classes.jar\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且应该是这样的:

\n\n
Assets\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Plugins\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Android\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 classes.jar\n
Run Code Online (Sandbox Code Playgroud)\n\n

显然(不适合我)会导致错误垃圾邮件无法找到签名的消息,因此软件无法读取这些类。

\n