Comunicación de Unity y Android: acceda al paquete jar de Android en Unity

       Recientemente, se han utilizado algunos métodos nativos en Android en proyectos, pero Unity por sí solo no puede implementarlos. Como dice el refrán, una buena memoria es peor que una mala escritura, así que registre el proceso de la prueba. Le resultará conveniente utilizarlo en el futuro.

      Esta prueba prueba principalmente una aplicación desarrollada nativamente en Android para transmitir mensajes y una aplicación desarrollada por Unity para recibir mensajes y realizar el procesamiento relacionado. Por supuesto, las dos aplicaciones están instaladas en el mismo dispositivo Android. La prueba solo implica que Unity reciba los datos y los imprima primero. Los otros dos son para probar los métodos estáticos y no estáticos en el jar que se llaman en Unity.

       Primero, les pedí a mis colegas de desarrollo de Android que me ayudaran a crear un paquete jar. Utilice la herramienta jd-gui.exe para ver el código fuente en el jar. Haga clic en jd-gui.exe para iniciar esta herramienta directamente:

Haga clic en Archivo -->Abrir archivo para buscar el archivo jar y abrirlo:

 

 

Importe el jar a Unity y colóquelo en Plugin/Android:

Al mismo tiempo, también debes importar un archivo AndroidMainfest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xx.xxxx" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true" android:isGame="true" android:banner="@drawable/app_banner">
    <activity android:name="com.gxxxx.unitymoduletest.MainActivity" android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
        <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
      </intent-filter>
    </activity>
  </application>
  <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="25" />
  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>

 

Cree código de prueba en Unity:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class test : MonoBehaviour {
    public Text text1;
    public Text text2;
    public Text text;
    public Text text4;
    public string AndroidClassName = "com.gxxx.unitymoduletest.MainActivity";
    public string GetLotMsgJsonMethod = "getLotMsgJson";
    public string GetIssMsgJsonMethod = "getIssMsgJson";
    public string GetHistoryTrendMethod = "getHistoryTrend";
    public string GetTestMethod = "getTestMethod";
    private AndroidJavaClass Ajc;
    public void FetchAndroidData()
    {
        if (Application.platform != RuntimePlatform.Android)
            return;
        //调用静态方法测试
        var LotMsgJson = Ajc.CallStatic<string>(GetLotMsgJsonMethod);
        if (!string.IsNullOrEmpty(LotMsgJson)) {
            text1.text = LotMsgJson;
            Debug.Log(LotMsgJson);
        }


        var IssMsgJson = Ajc.CallStatic<string>(GetIssMsgJsonMethod);
        if (!string.IsNullOrEmpty(IssMsgJson))
        {
            text2.text = IssMsgJson;
            Debug.Log(IssMsgJson);
        }


        var HistoryTrend = Ajc.CallStatic<string>(GetHistoryTrendMethod);
        if (!string.IsNullOrEmpty(HistoryTrend))
        {
            text.text = HistoryTrend;
            Debug.Log(HistoryTrend);
        }
    }

    private void Awake()
    {
        Ajc= new AndroidJavaClass(AndroidClassName);
    }
    private void Start()
    {
        FetchAndroidData();
    }

    //启动另外一个APP  调用非静态方法
    public void OpenOtherApp() {
        text4.text = "1";
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("UpApp");
        text4.text = "2";       
    }
    //调用非静态方法测试
    public void TestButton() {
        StartCoroutine(GetStr());
    }

    IEnumerator GetStr() {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("setTestMethod");
        yield return new WaitForEndOfFrame();
        var str = pluginClass.CallStatic<string>(GetTestMethod);
        text4.text = str;
    }
    public void QuictApp()
    {      
        Application.Quit();
    }
}

Para llamadas a métodos estáticos: 

 AndroidJavaClass jc= nueva AndroidJavaClass(AndroidClassName);

 var LotMsgJson = jc.CallStatic<cadena>(“nombre del método”)

Para llamadas a métodos no estáticos:

       AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//Debes escribir
        AndroidJavaObject así jo = jc.GetStatic<AndroidJavaObject>("currentActivity");//Debes escribir
        jo.Call("method nombre" así );     

En Unity, el código de prueba está vinculado a MainCamera y el botón vincula el método correspondiente:

 

Finalmente, libere el Apk para envolver dispositivos Android para realizar pruebas.

Resultados de la prueba:

    Inicie la aplicación desarrollada de forma nativa en Android, haga clic para abrir el programa de desarrollo de Unity, se abrirá la aplicación desarrollada por Unity y, al mismo tiempo, después de ingresar, se ejecutará el método estático en el paquete.

Haga clic en el botón de prueba: text4 muestra la palabra infierno en el paquete jar, lo que indica que se ejecuta el método setTestMethod no estático en el paquete y luego llama al método estático getTestMethod para devolver el resultado.

Haga clic para abrir la APLICACIÓN, se abrirá el programa de la APLICACIÓN de Android y la APLICACIÓN se ejecutará en segundo plano.

 

 

Supongo que te gusta

Origin blog.csdn.net/hemiaoyuan1989/article/details/105732516
Recomendado
Clasificación