Estou tentando entender como criar meus próprios plug-ins para Android.
Consigo chamar métodos estáticos na minha classe Java (a criada no AndroidStudio), mas realmente NÃO POSSO chamar métodos não estáticos.
Verifico esses 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
- como chamar o método não-estático do Unity Android Plugin?
Mas nenhum funciona.
Estou tentando receber a chamada de um botão do Unity, como:
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.Get<AndroidJavaObject>("currentActivity");
currentActivity.Call("SayHi");
E minha atividade no Android se parece com:
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_");
}
}
Meu ADB está lançando esta mensagem:
Também tentei ligar em vez do UnityPlayer, assim:
AndroidJavaClass pluginClass = new AndroidJavaClass("com.example.eric.librarytest.MainActivity");
EDIT: Este é o meu 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>
Mas também não funciona para métodos não estáticos, funciona apenas para métodos estáticos, se faço pluginClass.CallStatic("")
, alguma ideia?
EDIT 2:
Taras Leskiv sugere alterar o UnityPlayer.Get para UnityPlayer.GetStatic, mas então recebo o seguinte erro:
erro: java.lang.NoSuchMethodError: nenhum método não estático com nome = 'SayHi' signature = '() V' na classe Ljava.lang.Object;
- O programa não está ativo.
Activity
. Então, você pode precisar lançá-lo de alguma forma.Respostas:
Quando você está fazendo isso:
Não funciona porque o
currentActivity
campo é estático, o que você deve fazer é:Observe a parte UnityPlayer.GetStatic
Aqui está outro trecho de conveniência de um dos meus plugins:
fonte
Talvez isso tenha a ver com a herança do java: seu currentActivity AndroidJavaObject é da classe,
com.unity3d.player.UnityPlayer
mas essa classe não possuiSayHi
método, você deve converter seu objetoMainActivity
antes de chamar seu método.fonte
Meu código estava correto, o problema era a estrutura do projeto.
Meu projeto foi como:
E deve ser como:
O obvius (não para mim) causou o erro de spam na mensagem que não conseguiu encontrar a assinatura; portanto, o software não pode ler essas classes.
fonte
Tudo o que você precisa fazer é declarar seu próprio contexto estático na classe de atividade:
E, em seguida, basta chamar qualquer método não estático do C # assim:
Há NO outros métodos para chamar métodos diretamente do código java. Você pode implementar seu próprio sistema de mensagens usando os comandos AndroidJavaProxy e Broadcast sem sequer atividade, mas é outra questão.
fonte
onDestroy
.