笔者最近开发Unity,U3D调用android的开发,在其中遇到了许许多多的坑,接下来我会把坑都写出来,以及解决坑的一些办法,这里先起个头,如果你也在开发遇到了了坑可以留言一起交流。待我抽出时间整理出一个DEMO。

U3D调用android调用android还需要一个重要角色那就是classes.jar包,这个是unity与Android开发的一个中间桥梁:

需要导入到Lib中并引用,网上有说要类继承UnityPlayerActivity这个,笔者没有继承,可成功。

如果你有安装Unity,可按照这个路径去找:(Windos) C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar
 
(Mac ) Unity.app(show packages)Applications\Unity(rightclick ShowPackageContent)PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

如果是把Android打包未arr或者jar,已打好的放入unity前需要做很重要的一步:

下载压缩工具

Unity中开发Android调用Android及一系列的交互_Unity

通过压缩工具打开我们的jar或者AAR就是上图这样,这里 的classesb不用管。

Unity中开发Android调用Android及一系列的交互_Unity_02

打开左侧lib里面还是会有一个classes,这里的classes需要删除,否则导入unity,unity在打包时就会出现冲突。

压缩工具随后一起上传到CSDN,不会设置积分,放心下载。

Unity调用代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class aarTest : MonoBehaviour
{
    // Start is called before the first frame update
    AndroidJavaObject m_java;
    public Text text;
    private void Awake()
    {
        m_java = new AndroidJavaObject("com.u3d.com.unityAndroid.Views.Unity1Android");//com.u3d.com.unityAndroid.Views.Unity1Android 包名加类名,不能错哦
    }
    void Start()
    {
      
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    public void ArrTest1()
    {
        m_java = new AndroidJavaObject("com.u3d.com.unityAndroid.Views.Unity1Android");
        text.text = "开始调用方法";
        text.text += "\n + " + m_java;
        m_java.Call("showView");//showView方法名
        text.text += "\n 调用结束";

    }
   

}

Android部分代码:

package com.u3d.com.unityAndroid.Views;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.u3d.com.lib.R;

import com.u3d.com.unityAndroid.AdListener.OnListener;
import com.u3d.com.unityAndroid.bean.ResultData;
import com.u3d.com.unityAndroid.bean.ResultVedioDataBean;
import com.u3d.com.unityAndroid.config.Api;
import com.u3d.com.unityAndroid.utils.AdOnClick;
import com.u3d.com.unityAndroid.utils.GetImgUtil;
import com.u3d.com.unityAndroid.utils.HttpUtils;
import com.u3d.com.unityAndroid.utils.Json;


import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * Created by Admin on 2020/4/9.
 */

public class Unity1Android {
    public static Activity activity = null;

    private static final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_PHONE_STATE"};
    protected static String UA = "";
    private Activity _unityActivity;



    HttpUtils httpUtils = new HttpUtils();

    Activity getDiActivity() {
        try {
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
            return activity;
        } catch (ClassNotFoundException classNotFoundException) {

        } catch (IllegalAccessException illegalAccessException) {

        } catch (NoSuchFieldException noSuchFieldException) {
        }

        return null;
    }

   


    /**
     * 测试
     */

    public void showView() {
        final Activity curActivity = getDiActivity();
        (new Handler(curActivity.getMainLooper())).post(new Runnable() {
            @SuppressLint("ResourceType")
            public void run() {
                TextView textView = new TextView((Context) curActivity);
                textView.setText("123");
                textView.setWidth(-1);
                textView.setHeight(-1);
                textView.setBackgroundColor(curActivity.getResources().getColor(17170459));
                FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(400, 600);
                layoutParams.gravity = 17;
                ViewGroup totalView = (ViewGroup) curActivity.getWindow().getDecorView();
                totalView.addView((View) textView, (ViewGroup.LayoutParams) layoutParams);
            }
        });
    }

   
  

}

其中这个特别重要:

Activity getDiActivity() {
        try {
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
            return activity;
        } catch (ClassNotFoundException classNotFoundException) {

        } catch (IllegalAccessException illegalAccessException) {

        } catch (NoSuchFieldException noSuchFieldException) {
        }

        return null;
    }