Unity3D与Android互相调用踩坑总结_com/unity3d/player/unityplayer-程序员宅基地

技术标签: Unity3D  Android代码  

1.引入unity的 classes.jar包
本人安装unity-5.6.1版本,目录为D:\Program Files\unity-561\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
这里写图片描述
若直接将classes.jar导入AndroidStudio项目,编译出aar,Unity编译会报错:

IOException: Failed to Move File / Directory from 'Temp/StagingArea\android-libraries\app-debug\classes.jar' to 'Temp/StagingArea\android-libraries\app-debug\libs\classes.jar'.
UnityEditor.Android.PostProcessor.Tasks.ProcessAAR.Execute (UnityEditor.Android.PostProcessor.PostProcessorContext context)
UnityEditor.Android.PostProcessor.PostProcessRunner.RunAllTasks (UnityEditor.Android.PostProcessor.PostProcessorContext context)
UnityEditor.Android.PostProcessAndroidPlayer.PostProcess (BuildTarget target, System.String stagingAreaData, System.String stagingArea, System.String playerPackage, System.String installPath, System.String companyName, System.String productName, BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry)
UnityEditor.Android.AndroidBuildPostprocessor.PostProcess (BuildPostProcessArgs args)
UnityEditor.PostprocessBuildPlayer.Postprocess (BuildTargetGroup targetGroup, BuildTarget target, System.String installPath, System.String companyName, System.String productName, Int32 width, Int32 height, System.String downloadWebplayerUrl, System.String manualDownloadWebplayerUrl, BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.BuildReporting.BuildReport report) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/PostprocessBuildPlayer.cs:186)
UnityEditor.HostView:OnGUI()

将classes.jar更名unity-classes.jar后又报如下错误:

CommandInvokationFailure: Unable to convert classes into dex format.
D:/Program Files/Java/jdk1.8.0_181\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir="D:/AndroidSDK\tools" -Dfile.encoding=UTF8 -jar "D:\Program Files\unity-561\Unity\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar" -

stderr[
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lbitter/jnibridge/JNIBridge;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lbitter/jnibridge/JNIBridge$a;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/unity3d/player/NativeLoader;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/unity3d/player/ReflectionHelper;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/unity3d/player/ReflectionHelper$1;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/unity3d/player/ReflectionHelper$a;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/unity3d/player/UnityPlayer;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/unity3d/player/UnityPlayer$1;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/unity3d/player/UnityPlayer$10;

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Translation has been interrupted
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:614)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:310)
    at com.android.dx.command.dexer.Main.runDx(Main.java:288)
    at com.android.dx.command.dexer.Main.main(Main.java:244)
    at com.android.dx.command.Main.main(Main.java:95)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at SDKMain.main(SDKMain.java:130)
Caused by: java.lang.InterruptedException: Too many errors
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:606)
    ... 9 more
]
stdout[
processing archive D:\UnityWorkSpace\New Unity Project\Temp\StagingArea\android-libraries\app-debug\libs\.\classes.jar...
processing com/example/cyk/myapplication1/BuildConfig.class...
processing com/example/cyk/myapplication1/UnityActivity.class...
processing com/example/cyk/myapplication1/UnityActivity$1.class...
processing archive D:\UnityWorkSpace\New Unity Project\Temp\StagingArea\android-libraries\app-debug\libs\.\unity-classes.jar...
processing bitter/jnibridge/JNIBridge.class...
processing bitter/jnibridge/JNIBridge$a.class...
processing com/unity3d/player/NativeLoader.class...
processing com/unity3d/player/ReflectionHelper.class...
processing com/unity3d/player/ReflectionHelper$1.class...
processing com/unity3d/player/ReflectionHelper$a.class...
processing com/unity3d/player/UnityPlayer.class...
processing com/unity3d/player/UnityPlayer$1.class...
processing com/unity3d/player/UnityPlayer$10.class...
processing com/unity3d/player/UnityPlayer$1$1.class...
processing com/unity3d/player/UnityPlayer$11.class...
processing com/unity3d/player/UnityPlayer$12.class...
processing com/unity3d/player/UnityPlayer$12$1.class...
processing com/unity3d/player/UnityPlayer$13.class...
processing com/unity3d/player/UnityPlayer$14.class...
processing com/unity3d/player/UnityPlayer$15.class...
processing com/unity3d/player/UnityPlayer$16.class...
processing com/unity3d/player/UnityPlayer$17.class...
processing com/unity3d/player/UnityPlayer$18.class...
processing com/unity3d/player/UnityPlayer$19.class...
processing com/unity3d/player/UnityPlayer$2.class...
processing com/unity3d/player/UnityPlayer$20.class...
processing com/unity3d/player/UnityPlayer$21.class...
processing com/unity3d/player/UnityPlayer$3.class...
processing com/unity3d/player/UnityPlayer$4.class...
processing com/unity3d/player/UnityPlayer$5.class...
processing com/unity3d/player/UnityPlayer$6.class...
processing com/unity3d/player/UnityPlayer$7.class...
processing com/unity3d/player/UnityPlayer$8.class...
processing com/unity3d/player/UnityPlayer$9.class...
processing com/unity3d/player/UnityPlayer$a.class...
processing com/unity3d/player/UnityPlayer$b.class...
processing com/unity3d/player/UnityPlayer$c.class...
processing com/unity3d/player/UnityPlayer$c$1.class...
processing com/unity3d/player/UnityPlayer$d.class...
processing com/unity3d/player/UnityPlayerActivity.class...
processing com/unity3d/player/UnityPlayerNativeActivity.class...
processing com/unity3d/player/UnityPlayerProxyActivity.class...
processing com/unity3d/player/UnityWebRequest.class...
processing com/unity3d/player/WWW.class...
processing com/unity3d/player/a.class...
processing com/unity3d/player/a$a.class...
processing com/unity3d/player/b.class...
processing com/unity3d/player/b$1.class...
processing com/unity3d/player/b$2.class...
processing com/unity3d/player/b$3.class...
processing com/unity3d/player/b$4.class...
processing com/unity3d/player/c.class...
processing com/unity3d/player/d.class...
processing com/unity3d/player/e.class...
processing com/unity3d/player/f.class...
processing com/unity3d/player/f$1.class...
processing com/unity3d/player/g.class...
processing com/unity3d/player/h.class...
processing com/unity3d/player/h$1.class...
processing com/unity3d/player/h$2.class...
processing com/unity3d/player/h$3.class...
processing com/unity3d/player/i.class...
processing com/unity3d/player/i$1.class...
processing com/unity3d/player/i$a.class...
processing com/unity3d/player/j.class...
processing com/unity3d/player/k.class...
processing com/unity3d/player/l.class...
processing com/unity3d/player/l$a.class...
processing com/unity3d/player/m.class...
processing com/unity3d/player/m$a.class...
processing com/unity3d/player/m$b.class...
processing org/fmod/FMODAudioDevice.class...
processing org/fmod/a.class...
processing bin\classes\.\com\example\cyk\myapplication1\R.class...
processing bin\classes\.\com\example\cyk\myapplication1\R$attr.class...
processing bin\classes\.\com\example\cyk\myapplication1\R$drawable.class...
processing bin\classes\.\com\example\cyk\myapplication1\R$id.class...
processing bin\classes\.\com\example\cyk\myapplication1\R$layout.class...
processing bin\classes\.\com\example\cyk\myapplication1\R$mipmap.class...
processing bin\classes\.\com\example\cyk\myapplication1\R$string.class...
processing bin\classes\.\com\example\cyk\myapplication1\R$style.class...
processing archive bin\classes.jar...
processing bitter/jnibridge/JNIBridge.class...
processing bitter/jnibridge/JNIBridge$a.class...
processing com/unity3d/player/NativeLoader.class...
processing com/unity3d/player/ReflectionHelper.class...
processing com/unity3d/player/ReflectionHelper$1.class...
processing com/unity3d/player/ReflectionHelper$a.class...
processing com/unity3d/player/UnityPlayer.class...
processing com/unity3d/player/UnityPlayer$1.class...
processing com/unity3d/player/UnityPlayer$10.class...
processing com/unity3d/player/UnityPlayer$1$1.class...
processing com/unity3d/player/UnityPlayer$11.class...
processing com/unity3d/player/UnityPlayer$12.class...
processing com/unity3d/player/UnityPlayer$12$1.class...
processing com/unity3d/player/UnityPlayer$13.class...
processing com/unity3d/player/UnityPlayer$14.class...
processing com/unity3d/player/UnityPlayer$15.class...
processing com/unity3d/player/UnityPlayer$16.class...
processing com/unity3d/player/UnityPlayer$17.class...
processing com/unity3d/player/UnityPlayer$18.class...
processing com/unity3d/player/UnityPlayer$19.class...
processing com/unity3d/player/UnityPlayer$2.class...
processing com/unity3d/player/UnityPlayer$20.class...
processing com/unity3d/player/UnityPlayer$21.class...
processing com/unity3d/player/UnityPlayer$3.class...
processing com/unity3d/player/UnityPlayer$4.class...
processing com/unity3d/player/UnityPlayer$5.class...
processing com/unity3d/player/UnityPlayer$6.class...
processing com/unity3d/player/UnityPlayer$7.class...
processing com/unity3d/player/UnityPlayer$8.class...
processing com/unity3d/player/UnityPlayer$9.class...
processing com/unity3d/player/UnityPlayer$a.class...
processing com/unity3d/player/UnityPlayer$b.class...
processing com/unity3d/player/UnityPlayer$c.class...
processing com/unity3d/player/UnityPlayer$c$1.class...
processing com/unity3d/player/UnityPlayer$d.class...
processing com/unity3d/player/UnityPlayerActivity.class...
processing com/unity3d/player/UnityPlayerNativeActivity.class...
processing com/unity3d/player/UnityPlayerProxyActivity.class...
processing com/unity3d/player/UnityWebRequest.class...
processing com/unity3d/player/WWW.class...
processing com/unity3d/player/a.class...
processing com/unity3d/player/a$a.class...
processing com/unity3d/player/b.class...
processing com/unity3d/player/b$1.class...
processing com/unity3d/player/b$2.class...
processing com/unity3d/player/b$3.class...
processing com/unity3d/player/b$4.class...
processing com/unity3d/player/c.class...
processing com/unity3d/player/d.class...
processing com/unity3d/player/e.class...
processing com/unity3d/player/f.class...
processing com/unity3d/player/f$1.class...
processing com/unity3d/player/g.class...
processing com/unity3d/player/h.class...
processing com/unity3d/player/h$1.class...
processing com/unity3d/player/h$2.class...
processing com/unity3d/player/h$3.class...
processing com/unity3d/player/i.class...
processing com/unity3d/player/i$1.class...
processing com/unity3d/player/i$a.class...
processing com/unity3d/player/j.class...
processing com/unity3d/player/k.class...
processing com/unity3d/player/l.class...
processing com/unity3d/player/l$a.class...
processing com/unity3d/player/m.class...
processing com/unity3d/player/m$a.class...
processing com/unity3d/player/m$b.class...
processing org/fmod/FMODAudioDevice.class...
processing org/fmod/a.class...
]
exit code: 2
UnityEditor.Android.Command.Run (System.Diagnostics.ProcessStartInfo psi, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)
UnityEditor.Android.AndroidSDKTools.RunCommandInternal (System.String javaExe, System.String sdkToolsDir, System.String[] sdkToolCommand, Int32 memoryMB, System.String workingdir, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)
UnityEditor.Android.AndroidSDKTools.RunCommandSafe (System.String javaExe, System.String sdkToolsDir, System.String[] sdkToolCommand, Int32 memoryMB, System.String workingdir, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)
UnityEditor.HostView:OnGUI()

解决方法:
更改libs文件名,如unitylibs,classes.jar不用改名或者取任意名称即可,如图
这里写图片描述

2.AndroidManifest.xml配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.cyk.myapplication1">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.NoTitleBar">
        <activity android:name=".UnityActivity">
            <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>

3.Android Activity设置

package com.example.cyk.myapplication1;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class UnityActivity extends UnityPlayerActivity {
    

    private LinearLayout mLlUnityContainer;
    private Button mBtnRotate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_unity);
        initView();
    }

    private void initView() {
        mLlUnityContainer = (LinearLayout) findViewById(R.id.ll_unity_container);
        mBtnRotate = (Button) findViewById(R.id.btn_rotate);

        //将Unity的View添加到布局里
        View scene = mUnityPlayer.getView();
        mLlUnityContainer.addView(scene);

        mBtnRotate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //向Unity的Cube对象上的脚本里的RotateCube方法发送消息
                //第三个参数是传递的消息
                UnityPlayer.UnitySendMessage("Cube", "RotateCube", "80");
            }
        });
    }

    public void getNowTime(String temp) {
        long time = System.currentTimeMillis();
        String strTime = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss", Locale.CHINESE).format(new Date(time));
        Toast.makeText(this,temp+" haha "+strTime,Toast.LENGTH_LONG).show();
    }
}

4.将aar及AndroidManifest.xml文件导入到unity项目中
打开unity项目文件夹,目录不存在则创建相应文件夹,Assets\Plugins\Android,导入后效果如下

这里写图片描述

5.创建C#Script

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

public class RotateTest : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        Debug.Log("RotateTest Start");
    }

    // Update is called once per frame
    void Update()
    {
        //Debug.Log("RotateTest Update");
    }

    void RotateCube(string angle)
    {
        Debug.Log("RotateTest RotateCube angle:" + angle);
        this.gameObject.transform.Rotate(Vector3.up, float.Parse(angle));
    }

    public void unityBtnClick()
    {
        Debug.Log("RotateTest unityBtnClick");
        //通过报名获取java class (固定写法,好坑,不要以为是自已的Android包名)
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

        //获取当前的activity (固定写法,不要以为是自己定义的Activity名称。。。)
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

        //调用activity里面的方法,传入方法名和参数
        jo.Call("getNowTime", "Get Android Time");
    }

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kongxingxing/article/details/81119831

智能推荐

Python 任意字典生成 SQL(insert 语句)_python dict 转 sql-程序员宅基地

文章浏览阅读8.1k次,点赞8次,收藏16次。代码示例(复制用)dic = { 'url': 'URL', 'kw': 'KW', 'page': 'PAGE'}ls = list(dic)sentence = 'insert table_name(' + ','.join(ls) + ')values(' + ','.join(['&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;q_python dict 转 sql

java.sql.Timestamp与java.util.Date的相互转换_java.sql.timestamp 转java.util.date-程序员宅基地

文章浏览阅读5k次。public static void main(String[] args) throws ParseException { //测试java.sql.Timestamp取得当前的系统时间 Timestamp timestamp = new Timestamp(System.currentTimeMillis()); System.out.println("当前的系统时间java.sq_java.sql.timestamp 转java.util.date

ssm上传文件获取路径_又拍云:文件上传+下载+自定义下载路径(SSM+AJAX+JFileChooser)...-程序员宅基地

文章浏览阅读196次。这一篇是前几篇功能的总结http://blog..net/qq_36688143/article/details/79007120http://blog..net/qq_36688143/article/details/79007067http://blog..net/qq_36688143/article/details/78871406http://blog..net/qq_36688143/..._ssm设置下载路径

5G 核心网 PDU Session Release 信令流程_5g信令流程详解-程序员宅基地

文章浏览阅读1.4w次,点赞7次,收藏60次。下面来整理一下 TS 23.502 中的 UE or network requested PDU Session Release for non-roaming and roaming with local breakout 首先是信令流程图:接着是信令流程图的解读: 为什么会有PDU Session Release 流程呢?PDU Session..._5g信令流程详解

在Linux服务器上运行机器学习/深度学习python程序_linux 怎么跑python ai计算-程序员宅基地

文章浏览阅读6.3k次,点赞10次,收藏71次。日常如果我们的个人电脑满足不了某些机器学习/深度学习程序运行需求的话,一般需要在实验室或者公司服务器上跑自己的代码,这里介绍一下如何在linux服务器上运行机器学习/深度学习python程序。首先使用SecureCRT或者Xshell这种远程登录服务器软件登录你的实验室/公司服务器。由于一般用户不会获得root权限,而且系统里的Python版本一般都比较低或者一般都会缺失某些机器学习/深度学习包,那我们就需要在自己的用户文件夹下创建属于自己的虚拟环境。首先当然是要下载安装Anaconda啦。(版本和_linux 怎么跑python ai计算

layui 富文本编辑 c# mvc 图片上传服务接口_c#mvc如何获取layui的富文本编辑器-程序员宅基地

文章浏览阅读351次。layui 富文本编辑 c#_c#mvc如何获取layui的富文本编辑器

随便推点

修改idea工具默认版本JDK_idea设置默认jdk版本-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏7次。修改idea工具默认版本JDK_idea设置默认jdk版本

PCL点云处理之基于曲率的条件滤波 (一百四十六)_基于点的曲率滤波-程序员宅基地

文章浏览阅读466次。曲率是描述点云局部特征的重要数值,通常在建筑物边缘以及树木位置的点云曲率较大,而在地面等平面内部点云的曲率较小。设置合理的曲率阈值可以快速区分这两部分点云,条件滤波器是PCL内部灵活的滤波器,可以人为设置滤波条件,因此将二者结合,基于曲率条件进行滤波,得到符合自己理想的点。_基于点的曲率滤波

[QtWidget]Qt子窗口嵌入父窗口_qt widget大小绑定父窗体-程序员宅基地

文章浏览阅读3.3k次。1. 子窗口构造函数设置setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);hide();this->setParent(parent);2. 父窗口调用显示子窗口假设子窗口为ChildWidgetChildWidget *widget = new ChildWidget(this);widget-&..._qt widget大小绑定父窗体

DevExpress表格控件(GridView、GridControl)使用小结_this.gridcontrol1.datasource-程序员宅基地

文章浏览阅读7.7k次,点赞8次,收藏39次。GridControl创建表格1.点击VS“工具箱”的GridControl,在窗体上添加此控件;2.点击“RunDesigner”按钮,进入表格设计界面,点击“Columns”,添加列;3.在“Column properties”列属性中,“FileName”列字段(要与绑定的数据DataTable中的字段名一致),"Cation"(列显示的文字)“,设置完成则创建一个..._this.gridcontrol1.datasource

装系统的心得_计算机系统安装心得-程序员宅基地

文章浏览阅读911次。今天同学的电脑坏了,在群里面喊了,并附上截图,截图长这样没遇到过这样的情况,是个妹子我就想着问问情况帮忙,我给那个同学发了个私信,同学qq电话回我,问我能否可以下去看看,我就下去了。我最近也在想将笔记本上的win10改为win7,感觉win10用着实在不顺畅,各种出毛病,加之在系统上用过office的破解软件,之后IE浏览器、onenote、outlook等就再也用不了了。笔记本是独显,最_计算机系统安装心得

ValueError: Unrecognized configuration class <class transformers_modules.Qwen-7B-Chat...解决方案_valueerror: unrecognized configuration class <clas-程序员宅基地

文章浏览阅读5.6w次,点赞14次,收藏12次。本文主要介绍了ValueError: Unrecognized configuration class _valueerror: unrecognized configuration class

推荐文章

热门文章

相关标签