Estoy tratando de entender cómo construir mis propios complementos de Android para Android.
Logro llamar a métodos estáticos en mi clase Java (la creada en AndroidStudio), pero realmente NO PUEDO llamar a métodos no estáticos.
Reviso esos enlaces:
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
- ¿Cómo llamar al método no estático desde Unity Android Plugin?
Pero ninguno funciona.
Estoy tratando de recibir la llamada de un botón de Unity como:
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.Get<AndroidJavaObject>("currentActivity");
currentActivity.Call("SayHi");
Y mi actividad en Android se ve así:
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_");
}
}
Mi ADB está lanzando este mensaje:
También he intentado llamar en lugar de UnityPlayer llamarlo así:
AndroidJavaClass pluginClass = new AndroidJavaClass("com.example.eric.librarytest.MainActivity");
EDITAR: Este es mi 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>
Pero tampoco funciona para métodos no estáticos, solo funciona para métodos estáticos si lo hago pluginClass.CallStatic("")
, ¿alguna idea?
EDITAR 2:
Taras Leskiv sugiere cambiar UnityPlayer.Get a UnityPlayer.GetStatic, pero luego aparece el siguiente error:
error: java.lang.NoSuchMethodError: ningún método no estático con nombre = 'SayHi' firma = '() V' en la clase Ljava.lang.Object;
- Proguard no está activo.
Activity
. Por lo tanto, es posible que deba lanzarlo de alguna manera.Respuestas:
Cuando haces esto:
No funciona porque el
currentActivity
campo es estático, lo que debe hacer es:Observe la parte UnityPlayer.GetStatic
Aquí hay otro fragmento de conveniencia de uno de mis complementos:
fuente
Tal vez tenga que ver con la herencia de Java: su CurrentActivity AndroidJavaObject es de clase
com.unity3d.player.UnityPlayer
pero esta clase no tieneSayHi
método, debe lanzar su objetoMainActivity
antes de llamar a su método.fuente
Mi código era correcto, el problema era la estructura del proyecto.
Mi proyecto fue como:
Y debería ser como:
¿Obvius (no para mí) causó el error spam del mensaje que no pudo encontrar la firma, por lo que el software no puede leer esas clases?
fuente
Todo lo que necesita hacer es declarar su propio contexto estático en la clase de actividad:
Y luego simplemente llame a cualquier método no estático desde C # como este:
Hay NO otros métodos para llamar a métodos directamente desde el código de Java. Puede implementar su propio sistema de mensajería utilizando los comandos AndroidJavaProxy y Broadcast sin siquiera actividad, pero es otra pregunta.
fuente
onDestroy
.