环境 Android studio 3.4 + unity2018.3

1,android studio 新建空工程,一切默认,完成。
这个空工程只是个壳,它的所有参数都没什么用,它存在的意义是为了后面能创建 module。
因为JAVA不像C++,可以直接创建类库。
2,新建模块
file->new module->android library
application name 和 module name 都不重要,没有实际用处(这里取名mylibrary),重要的是包名: package name。
这里取名为 com.x.y
包名用到哪些地方?
(1,AndroidManifest.xml里的 package
(2,每个java文件的开始处,形如 package com.x.y,表示此java文件被放入了工程的com/x/y目录下
(3,unity 的build Settings里的 package name

这三处必须使用同一个包名,如果不一致则启动时闪退。如果想修改包名,就要修改这三处就行了。

3,在mylibrary模块下的src/java/com.x.y/添加java文件,随便取名,就叫MainActivity吧
修改其源码如下:

  1. package com.x.y;
  2.  
  3. import android.content.Intent;
  4. import com.unity3d.player.UnityPlayerActivity;
  5. import android.app.Activity;
  6. import android.os.Bundle;
  7.  
  8. public class MainActivity extends UnityPlayerActivity {
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. //setContentView(R.layout.activity_main);
  13. activity = this;
  14. }
  15.  
  16. //public static MainActivity activity;
  17. public static MainActivity activity;
  18. public int Calc(int x, int y){
  19. return x + y;
  20. }
  21.  
  22. public static float Calcf(float x, float y){
  23. return x + y;
  24. }
  25.  
  26. public void restartApplication() {
  27. new Thread(){
  28. public void run(){
  29. Intent launch=getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
  30. launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  31. startActivity(launch);
  32. android.os.Process.killProcess(android.os.Process.myPid());
  33. }
  34. }.start();
  35.  
  36. finish();
  37. }
  38. }

这个类的目的:
(1,测试普通成员函数和静态函数的调用
(2,测试重启功能

4,修改mylibary模块的AndroidManifest.xml,这一步放在最后也行,此文件是拿给UNITY用的,内容如下:

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.x.y">
  2.  
  3. <application android:allowBackup="true" android:label="@string/app_name">
  4. <activity android:name=".MainActivity" android:label="@string/app_name">
  5. <intent-filter>
  6.   <action android:name="android.intent.action.MAIN"/>
  7.   <category android:name="android.intent.category.LAUNCHER"/>
  8. </intent-filter>
  9. </activity>
  10. </application>
  11.  
  12. </manifest>

注意一定要有下面两行
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
学过安卓开发的都知道这是标记此活动是主活动,没有主活动的应用是不会被运行的。
默认情况下UNITY会创建自己AndroidManifest.xml,一旦我们在Assets/Plugins/Android/下放置了我们自定的AndroidManifest.xml,
UNITY就以我们的配置为主,并将buildsettings里的相关配置合并进来,如安装位置,持久化路径等。
因此,如果我们生成了自己的AndroidManifest.xml,却又不配置为主活动,安装后桌面没有图标,因为它不是一个可执行程序。

5,修改mylibrary模块的 build.gradle(注意不是修改工程的),为编译做准备,在末尾添加:

  1. task exportJar(type: Copy) {
  2. //必须先删除旧的包,否则新包不会生成,这个目录对应mylibrary/build/libs/AndroidUtils.jar
  3. delete 'build/libs/AndroidUtils.jar'
  4.  
  5. //生成的目录在这里
  6. from('build/intermediates/packaged-classes/release/')
  7.  
  8. //生成build/libs目录,并将build/intermediates/packaged-classes/release/下的classes.jar复制到此目录
  9. into('build/libs/')
  10.  
  11. //指定我们只在build/intermediates/packaged-classes/release/下寻找classes.jar(放入到build/libs/目录
  12. include('classes.jar')
  13.  
  14. //重命名下,起个个性的名字,不要与别人混淆
  15. rename('classes.jar', 'AndroidUtils.jar')
  16. }
  17.  
  18. //这里会触发真正对mylibaray的编译
  19. exportJar.dependsOn(build)

然后点击工具栏上的 run anything: ,或双击ctrl,在弹出的输入窗口中输入 gradlew exprotJar,回车,等待编译完成。
如果没问题,会提示 BUILD SUCCESSFUL
如果出了错,仔细看前面的输出LOG。

这里的注意点:
(1,from('build/intermediates/packaged-classes/release/') 这里的路径在不同版本的 Android Studio中不同。
在低版本的AS中路径为 build/intermediates/bundles/release
如果编译中报错 exportJar: NO-SOURCE,就说明是此路径错误了,这时就去磁盘上的build/intermediates/目录搜索classes.jar文件,
找到它的路径,写入到from里就对了。

6,生成完成后,得到我们的AndroidUtils.jar包,新建UNITY工程,package name取名:com.x.y

在Assets下新建如下目录 Plugins/Android,然后将AndroidManifest.xml放入到此目录下,然后在创建 Plugins/Android/libs目录,
将AndroidUtils.jar放入此目录。
注意这里的目录结构要求:AndroidManifest.xml必须与libs同目录,AndroidUtils.jar必须在libs目录中,名字不能错。
但libs和XML不一定直接在Android下,可以是多层目录下,如:Android/abc/libs也可以

7,添加脚本,随便挂在什么上,如相机上,测试代码如下:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5.  
  6. public class calljava : MonoBehaviour
  7. {
  8. AndroidJavaObject jo;
  9. Text info;
  10.  
  11. void Start()
  12. {
  13. //方式一,使用基类,这种比较通用
  14. var jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  15. jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
  16. info = GameObject.Find("TextInfo").GetComponent<Text>();
  17. info.text += "start \n";
  18.  
  19. //方式二,使用具体类,不通用,当类名改了就要改这里的字符串
  20. //var jc = new AndroidJavaClass("com.example.mylibraryx.MainActivity");
  21. //jo = jc.GetStatic<AndroidJavaObject>("activity");
  22.  
  23. info.text += "get java object " + (jo == null ? "null\n" : "ok\n");
  24.  
  25. //var btn = GetComponent<Button>();
  26. //btn.onClick.AddListener(() =>
  27. //{
  28. if (jo != null)
  29. {
  30. //注意1,参数类型必须传对,否则运行到这里就出错了
  31. var ret = jo.Call<int>("Calc", , );
  32. info.text += "call ret : " + ret + " \n";
  33.  
  34. //调用静态函数
  35. var retf = jo.CallStatic<float>("Calcf", (float)10.2, (float)20.2);
  36. info.text += "call retf : " + retf + " \n";
  37.  
  38. //注意2,由于Calcf是个静态函数,非静态调用会造成参数错位,结果为retfx = 10.2
  39. var retfx = jo.Call<float>("Calcf", (float)10.2, (float)20.2);
  40. info.text += "call retfx : " + retfx + " \n";
  41.  
  42. }
  43.  
  44. //});
  45. }
  46.  
  47. // Update is called once per frame
  48. void Update()
  49. {
  50.  
  51. }
  52. }

8,打包APK,到安卓上运行。在UNITY上运行会出错,提示jo为空.

AndroidStudio3.4+Unity2018.3,导出JAR包给UNITY使用的更多相关文章

  1. Unity 3D与Android Studio安卓交互之-导出jar包

    u3d与安卓 jar 包交互 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

  2. Android Studio安卓导出aar包与Unity 3D交互

    Unity与安卓aar 包交互 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  3. Android Studio 导出jar包

    不像在Eclipse,可以直接导出jar包.AndroidStudio只可以生成aar包. 在网上看到许多朋友问怎么可以像Eclipse一样导出jar包,其实我们只要知道它的原理就可以了. 用jar命 ...

  4. android studio 使用gradle 导出jar包,并打包assets目录

    警告:本文年久失修. 随着android studio的升级 ,gradle的升级,严格按照本文的代码去做可能不会成功,希望依然可以作为解决问题的思路. 最近项目在做一个sdk,供别的开发者使用,所以 ...

  5. [转]AndroidStudio导出jar包

    原文链接:http://blog.csdn.net/hjq842382134/article/details/38538097# 1. 不像在Eclipse,可以直接导出jar包.AndroidStu ...

  6. [Android Pro] AndroidStudio导出jar包

    reference :  http://blog.csdn.net/beijingshi1/article/details/38681281 不像在Eclipse,可以直接导出jar包.Android ...

  7. [转]--android studio 使用gradle 导出jar包,并打包assets目录

    转自: http://www.cnblogs.com/wuya/p/android-studio-gradle-export-jar-assets.html   最近项目在做一个sdk,供别的开发者使 ...

  8. eclipse导出jar包

    第一种:普通类导出jar包,我说的普通类就是指此类包含main方法,并且没有用到别的jar包. 1.在eclipse中选择你要导出的类或者package,右击,选择Export子选项: 2.在弹出的对 ...

  9. Spring Boot导出jar包发布

    一:事由 现在的项目组开发项目使用的是Spring Boot的技术,开发的时候是直接通过一个入口主函数来启动项目的.如果将项目交给客户,怎样才能正确的发布运行呢?百度了一下有关的知识,大概了解到是通过 ...

随机推荐

  1. SQL语句创建函数

    ----先create,再alter alter function fuc (@userid int,@strWhere varchar(max),@strWhere2 varchar(max) )  ...

  2. CENTOS6.5 编译安装MySQL5.7.14

    前言 mysql5.7.14 编译安装在自定义文件路径下 下载安装包 配置安装环境 编译安装 cmake \ -DCMAKE_INSTALL_PREFIX=/data/db5714 \ -DMYSQL ...

  3. 2019牛客暑期多校训练营(第三场) - J - LRU management - 模拟

    https://ac.nowcoder.com/acm/contest/883/J 根据这个数据结构的特点,也就是计算机组成原理里面学过的cache的LRU管理算法,每次访问都会在cache中查询一页 ...

  4. Git基本常用指令

    开发十年,就只剩下这套架构体系了! >>>   Git基本常用命令如下: mkdir:         XX (创建一个空目录 XX指目录名) pwd:          显示当前目 ...

  5. SQLyog安装

    安装 使用 首先看到下面的界面

  6. C# ASP.NET发送电子邮件System.Net.Mail

    1.补充知识 (1)POP3和SMTP服务器是什么? 简单点来说:POP3 用于接收电子邮件 ,SMTP 用于发送电子邮件. (1)POP3具体指什么? POP3(Post Office Protoc ...

  7. mybatis对java自定义注解的使用

    转自:https://www.cnblogs.com/sonofelice/p/4980161.html 最近在学习spring和ibatis框架. 以前在天猫实习时做过的一个小项目用到的mybati ...

  8. 输vim /etc/rc.d/init.d/mysqld 报错 …..localdomain.pid

    在安装MySQL的过程中出现以下错误: 本人解决方法是: ps aux | grep mysqld 罗列出所有关于mysqld的进程,然后把关于mysqld的进程都kill了.

  9. VNware上安装虚拟机Ubuntu16.10 并安装petalinux

    1.下载 VMware VMware-workstation-full-15.0.0-10134415.exe 自己寻找激活码 Ubuntu镜像 UG1144 PetaLinux Tools Docu ...

  10. uboot学习之五-----uboot如何启动Linux内核

    uboot和内核到底是什么?uboot实质就是一个复杂的裸机程序:uboot可以被配置也可以做移植: 操作系统内核本身就是一个裸机程序,和我们学的uboot和其他裸机程序没有本质的区别:区别就是我们操 ...