天天看點

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

Unity3D與Android互相調用踩坑總結

若直接将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:)
UnityEditor.HostView:OnGUI()
           

将classes.jar更名unity-classes.jar後又報如下錯誤:

CommandInvokationFailure: Unable to convert classes into dex format.
D:/Program Files/Java/jdk1_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:)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:)
    at com.android.dx.command.dexer.Main.runDx(Main.java:)
    at com.android.dx.command.dexer.Main.main(Main.java:)
    at com.android.dx.command.Main.main(Main.java:)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
    at java.lang.reflect.Method.invoke(Method.java:)
    at SDKMain.main(SDKMain.java:)
Caused by: java.lang.InterruptedException: Too many errors
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:)
    ...  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: 
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不用改名或者取任意名稱即可,如圖

Unity3D與Android互相調用踩坑總結

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,導入後效果如下

Unity3D與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");
    }

}
           

繼續閱讀