最近在做一些前端的尝试,需要用到unity3d调用android原生开发打包好的一些功能,于是就在网上搜索一些方法,发现网上的一些方法多多少少有一点错误!这里自己写一个随笔记录一下。

一、首先创建android开发好的arr包(android studio开发环境)

1.创建android工程

这里的sdk选择比较重要,要与调试机以及等下unity工程里面的minmun sdk 版本一样才可以(有些低版本的unity支持的sdk版本较低),不然会在unity编译打包的时候报错误!

2、修改android工程build.gradle(android studio环境需要),让工程变成library

3、将unity的开发包jar导入到android工程中

找到unity的开发包classes.jar,路径在unity的安装路径中(D:\Program Files\Unity 2017.1.0b1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes\classes.jar)中,

右键复制classes.jar,直接黏贴到android studio工程libs文件夹中

右键app,弹出下拉菜单,选择Open module setting,在弹出的窗口中切换到Dependencies选项卡,将classes.jar包含到工程里面

4.修改class main ,Mainacity代码让他继承与UnityPlayerActivity类

下面是我的代码,写了两个方法,一个是用来测试接口返回值,一个是用来测试调用弹窗的

package com.example.hsh.testun;import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity {Context m_context;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main);m_context = this;}public String ShowDialog(final String _title, final String _content){return "Java return";}public void dialog2(){Log.d("dialog2","ffffffffffff");}public void dialog1(){AlertDialog.Builder mBuilder=new AlertDialog.Builder(m_context);mBuilder.setTitle("testtttt").setMessage("xxxxxxxxxxxxxxxxx").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// Whatever...
                    }});AlertDialog dialog=mBuilder.create();dialog.show();}
}

5、编译成arr

二、创建unity工程

1、拉入Buttion跟Text组件用于测试

2、创建Plugins/Android路径(必须是一样名字的)

将刚才android工程创建的arr包中classes.jar,放到unity工程的Plugins/Android路径中,并创建AndroidManifest.xml文件

AndroidManifest.xml文件内容如下

<?xml version="1.0" encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.example.hsh.testun"xmlns:tools="http://schemas.android.com/tools"android:installLocation="preferExternal"android:versionCode="1"android:versionName="1.0"><supports-screensandroid:smallScreens="true"android:normalScreens="true"android:largeScreens="true"android:xlargeScreens="true"android:anyDensity="true"/><uses-permission android:name="android.permission.INTERNET"/><applicationandroid:theme="@style/UnityThemeSelector"android:icon="@drawable/app_icon"android:label="@string/app_name"android:debuggable="true"><activity android:name=".MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-data android:name="unityplayer.UnityActivity" android:value="true" /></activity></application>
</manifest>

其中<activity android:name=".MainActivity">,属性名要和自己android jar中的activity名字一样,我的就是MainActivity,所以不用更改

3、创建c#测试脚本

using UnityEngine;
using System.Collections;
using UnityEngine.UI;public class TestBtnScript: MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}public void MyShowDialog(){// Android的Java接口    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");//AndroidJavaClass jc = new AndroidJavaClass("com.example.hsh.testun.MainActivity");//AndroidJavaObject jo = new AndroidJavaObject("com.example.hsh.testun.MainActivity");// 参数    string[] mObject = new string[2];mObject[0] = "Dialog title";mObject[1] = "Dialog text is here!!";
try{jo.Call("dialog1");string ret = jo.Call<string>("ShowDialog", mObject);Text text4 = GameObject.Find("Canvas/Text").GetComponent<Text>();text4.text = ret;}catch(System.Exception e){Text text2 = GameObject.Find("Canvas/Text").GetComponent<Text>();text2.text = e.ToString();}// 调用方法     }
}

将MyShowDialog方法绑定到button的点击事件,就可以了。

注意,C#代码中,有注释的//AndroidJavaObject jo = new AndroidJavaObject("com.example.hsh.testun.MainActivity");

如果用这个jo直接调用call去调用android中的ShowDialog方法,是可以拿到string的返回值的,但是调用dialog1去弹窗的情况,会出现安卓报错nullpointer的错误。(具体空指针位置在代码AlertDialog.Builder mBuilder=new AlertDialog.Builder(m_context);这一行中,具体原因不太明白,希望有理解安卓机制的大牛告知)。

转载于:https://www.cnblogs.com/Parchk/p/7289854.html

Unity3d调用Andriod相关推荐

  1. android 引用非 android 工程,Unity3D调用android方法(非插件方式)

    关于Unity3D工程与android工程的转换与合并,请参考我的另外一篇博客,如果你对Unity3D工程加入到android工程的过程不熟悉,也请先看完下面这篇博客: android与Unity3D ...

  2. Unity3D调用android方法(非插件方式)

    关于Unity3Dproject与androidproject的转换与合并,请參考我的另外一篇博客.假设你对Unity3Dproject增加到androidproject的过程不熟悉.也请先看完以下这 ...

  3. Unity3D调用Android提供的接口

    需求:Android提供相关的接口,android只提供接口,没有相关的界面,android接口打包以jar包的形式供Unity3D调用 1.编写相关的android接口 在studio中新建工程,并 ...

  4. Unity3d调用Android版so库

    C源码封装Android版函数库 工具介绍 需要Android NDK工具包,下载地址为: https://developer.android.google.cn/ndk/downloads/inde ...

  5. unity3d调用android方法,Unity3D 调用Android原生方法2

    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅Unity3D引擎技术交流QQ群:[119706192]本文链接地址:Unity3D 调用Android原生方法2 记一次Unity通过An ...

  6. uniapp 调用andriod 接口

    uniapp 调用 andriod 接口 获取本地相册 /照相机功能(vue3) importOrChooseImage.vue <template><view style=&quo ...

  7. unity3d 调用windows窗口

     1 编辑模式(Editor)下: string path = EditorUtility.OpenFilePanel("Load png Textures of Directory&q ...

  8. unity无法调用android,Unity3D调用android方法(非插件方式)

    关于Unity3D工程与android工程的转换与合并,请参考我的另外一篇博客,如果你对Unity3D工程加入到android工程的过程不熟悉,也请先看完下面这篇博客: 下面,我们来说说本博客的终端, ...

  9. unity3d 调用Start 注意

    在unity3d中,同一个脚本被绑定到多个物体上的时候,只有active的物体才会调用void Start ()  方法, 如果物体是NO Active 的状态,则不会调用Start,Awake也不会 ...

  10. unity3d android aar,Android Stuido导出AAR 给Unity3D调用注意事项

    1. 导出 AAR过程需要注意,依赖的文件并没有打进去,所以要收到拷入到 Unity项目中,如下图中的 support包,是我项目中要用到的: 2.删除aar包中重复的 libs下的 jar文件和 j ...

最新文章

  1. Microbiome: 绝对定量环境样本细菌、真菌、真核群落丰度
  2. AcWing - 165 小猫爬山(dfs)
  3. 华为交换机的配置及:access、trunk、hybird端口详解
  4. Codeforces 746 G. New Roads
  5. 2019 ICPC Asia Nanchang Regional And and Pair 组合数学
  6. python compare excel_python简单操作excle的方法
  7. py哪个函数可以返回输入的变量类型_[Python基础]二、pycharm,python变量
  8. 日志写入hbase_千亿级日志系统设计思路,牛人必学!
  9. 清翔电子单片机原理图stc89c52_1000. 电子编程入门到工程师--从看得到开始
  10. 新时达as380服务器显示75,成为电梯高手之新时达AS380控制系统故障代码
  11. 顶级域名 一级域名 二级域名 三级域名划分
  12. 修改输入框placeholder文字样式(颜色、字号等)
  13. 佳能数码相机照片删除了怎么恢复,如何恢复还原佳能相机误删的照片
  14. turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程
  15. 2022K+全球软件研发行业创新峰会议题海选精彩进行中
  16. M1 Mac安装 PS 2021 闪退、卡启动界面解决方法
  17. Gitee上传代码教程
  18. Unity-3d小游戏开发-----走迷宫
  19. 那些年啊,那些事——一个程序员的奋斗史 ——98
  20. 最小生成树prim之挖井

热门文章

  1. C/C++黑魔法-另类switch
  2. linux基本知识点汇集
  3. Masm 如何调试汇编代码
  4. 迪赛智慧数——折线图(面积折线图):各年龄段员工离职率
  5. STIPC-003_编程挑战系列赛第三场(柯柯的期末祝福) _F.小柯来放水
  6. 去除Ubuntu 20桌面图标的快捷方式箭头
  7. chorme唤起Java开发的本地程序全采坑记
  8. 在 Windows 10 中如何查看系统的激活状态?
  9. 至简设计系列_7段数码管显示
  10. 专注网格剖分 - TetGen,NETGEN,Steller