Ich versuche zu verstehen, wie ich meine eigenen Android-Plugins für Android erstelle.
Ich kann statische Methoden in meiner Java-Klasse (die in AndroidStudio erstellt wurde) aufrufen, aber ich kann wirklich keine nicht statischen Methoden aufrufen.
Ich überprüfe diese Links:
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
- Wie rufe ich eine nicht statische Methode vom Unity Android Plugin auf?
Aber keiner funktioniert.
Ich versuche, den Anruf über eine Schaltfläche von Unity zu erhalten, z. B.:
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.Get<AndroidJavaObject>("currentActivity");
currentActivity.Call("SayHi");
Und meine Aktivität auf Android sieht so aus:
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_");
}
}
Mein ADB wirft diese Nachricht:
Ich habe auch versucht, anstelle von UnityPlayer Folgendes aufzurufen:
AndroidJavaClass pluginClass = new AndroidJavaClass("com.example.eric.librarytest.MainActivity");
EDIT: Dies ist meine 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>
Aber funktioniert es auch nicht für nicht statische Methoden, es funktioniert nur für statische Methoden, wenn ich das tue pluginClass.CallStatic("")
, eine Idee?
EDIT 2:
Taras Leskiv schlägt vor, UnityPlayer.Get in UnityPlayer.GetStatic zu ändern, aber dann erhalte ich den folgenden Fehler:
Fehler: java.lang.NoSuchMethodError: Keine nicht statische Methode mit dem Namen = 'SayHi' Signatur = '() V' in der Klasse Ljava.lang.Object;
- Proguard ist nicht aktiv.
Activity
. Vielleicht müssen Sie es irgendwie besetzen.Antworten:
Wenn Sie dies tun:
Es funktioniert nicht, weil das
currentActivity
Feld statisch ist. Was Sie tun sollten, ist:Beachten Sie den Teil UnityPlayer.GetStatic
Hier ist ein weiterer Convenience-Ausschnitt aus einem meiner Plugins:
quelle
Vielleicht hat es mit der Java-Vererbung zu tun: Ihr currentActivity AndroidJavaObject ist von Klasse,
com.unity3d.player.UnityPlayer
aber diese Klasse hat keineSayHi
Methode. Sie sollten Ihr Objekt umwandeln ,MainActivity
bevor Sie Ihre Methode aufrufen.quelle
Mein Code war korrekt, das Problem war die Projektstruktur.
Mein Projekt war wie folgt:
Und sollte sein wie:
Wurde obvius (nicht für mich) verursacht, dass der Fehler Spam die Nachricht war, die die Signatur nicht finden konnte, so dass die Software diese Klassen nicht lesen kann.
quelle
Sie müssen lediglich Ihren eigenen statischen Kontext in der Aktivitätsklasse deklarieren:
Rufen Sie dann einfach eine nicht statische Methode aus C # wie folgt auf:
Es gibt KEINE anderen Methoden, um Methoden direkt aus Java-Code aufzurufen. Sie können Ihr eigenes Nachrichtensystem mit den Befehlen AndroidJavaProxy und Broadcast implementieren, ohne überhaupt aktiv zu sein. Dies ist jedoch eine andere Frage.
quelle
onDestroy
.