java - 在自定义 Unity Android 插件上调用非静态方法
问题描述
我试图了解如何为 Android 构建我自己的 Android 插件。
我实现了在我的 Java 类(在 AndroidStudio 上创建的)上调用静态方法,但我真的不能调用非静态方法。
我检查了这些链接:
https://answers.unity.com/questions/884503/cant-call-non-static-method-in-androidjavaclass.html
http://leoncvlt.com/blog/a-primer-on-android-plugin-development-in-unity/
https://answers.unity.com/questions/1327186/how-to-get-intent-data-for-unity-to-use.html
- 如何从 Unity Android 插件调用非静态方法?
但没有一个有效。
我正在尝试从 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_");
}
}
我也尝试过调用而不是 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>
但是对于非静态方法也不起作用,如果我这样做,它只适用于静态方法pluginClass.CallStatic("")
,知道吗?
编辑2:
Taras Leskiv 建议将 UnityPlayer.Get 更改为 UnityPlayer.GetStatic,但随后出现以下错误:
错误:java.lang.NoSuchMethodError:在类 Ljava.lang.Object 中没有名称 ='SayHi' 签名 ='()V' 的非静态方法;
- Proguard 未激活。
解决方案
当你这样做时:
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.Get<AndroidJavaObject>("currentActivity");
currentActivity.Call("SayHi");
它不起作用,因为该currentActivity
字段是静态的,您应该做的是:
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
currentActivity.Call("SayHi");
注意UnityPlayer.GetStatic部分
这是我的一个插件中的其他便利片段:
static AndroidJavaObject _activity;
public static AndroidJavaObject Activity
{
get
{
if (_activity == null)
{
var unityPlayer = new AndroidJavaClass(C.ComUnity3DPlayerUnityPlayer);
_activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
}
return _activity;
}
}
推荐阅读
- python-3.x - 我如何在 Arch linux 上的 alpine chroot 上安装 psutil?
- postgresql - 从 debian 和 ubuntu 客户端连接时 Postgres“连接超时”,但从 Windows 可以正常
- c# - 我不知道为什么我的小巧玲珑 Multi-Mapper 给出了一个例外
- firebase - Firestore:在属性(映射/数组)而不是子集合中处理对对话线程的回复是否可行?
- javascript - 如何检查 api 变量是否在 js 中更新
- r - 如何通过修复输出数据表或类似内容来概括代码并提高性能?
- uiview - 显示大于自身的图像时,UIScrollView 内的 UIImageView 的行为
- wordpress - 如何在wordpress的产品页面中添加自定义简码按钮
- swift - 闭包线程安全吗?
- python - 有没有办法在网络上的套接字之间同步发送信息?