赞
踩
Unity端:UI
Android端:代码逻辑
新建Android工程:SimpleCalc。
选择最低版本4.0.3.
选择Empty Activity。
MainActivity默认设置就好,Finish.
由于我们不使用Android来布局,故activity_main.xml默认即可。
位置:
Unity3d_1.2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
classes.jar复制到工程中的libs下
将classes.jar添加为library。
添加完成后,classes.jar可展开。
到此,SimpleCalc/app/build.gradle得到如下所示:
创建4个Empty Activity如下(均使用默认设置):
原(同下):
修改后:
修改后:
修改后:
2.3.2 修改MainActivity
将MainActivity作为接口。原MainActivity如下:
修改为:
import android.app.Activity; import com.unity3d.player.UnityPlayerActivity; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MainActivity extends UnityPlayerActivity { /** * unity项目启动时的的上下文 */ private Activity _unityActivity; /** * 获取unity项目的上下文 * @return */ Activity GetActivity(){ if(null == _unityActivity) { try { Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer"); Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype); _unityActivity = activity; } catch (ClassNotFoundException e) { } catch (IllegalAccessException e) { } catch (NoSuchFieldException e) { } } return _unityActivity; } /** * 调用Unity的方法 * @param gameObjectName 调用的GameObject的名称 * @param functionName 方法名 * @param args 参数 * @return 调用是否成功 */ boolean CallUnity(String gameObjectName, String functionName, String args){ try { Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer"); Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class); method.invoke(classtype,gameObjectName,functionName,args); return true; } catch (ClassNotFoundException e) { } catch (NoSuchMethodException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } return false; } public void Calc(int operator, double a, double b){ if (operator >=0 && operator < 4){ switch (operator){ case 0: CallUnity("Canvas","FromAndroid",String.valueOf(AdditionActivity.Add(a,b))); break; case 1: CallUnity("Canvas","FromAndroid",String.valueOf(SubtractionActivity.Subtract(a,b))); break; case 2: CallUnity("Canvas","FromAndroid",String.valueOf(MultiplicationActivity.Multiply(a,b))); break; case 3: CallUnity("Canvas","FromAndroid",String.valueOf(DevisionActivity.Devide(a,b))); break; default: break; } } // else{ // return false; // } // return true; } }
修改如下:
//apply plugin: 'com.android.application' apply plugin: 'com.android.library' android { compileSdkVersion 28 // Add sourceSets { main { //Path to your source code java { srcDir 'src/main/java' } } } defaultConfig { // applicationId "com.polin.simplecalc" minSdkVersion 15 targetSdkVersion 28 // versionCode 1 // versionName "1.0" // testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } // Add lintOptions { abortOnError false } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation files('libs/classes.jar') } // Add //task to delete the old jar task deleteOldJar(type: Delete) { delete 'release/AndroidPlugin.jar' } //task to export contents as jar task exportJar(type: Copy) { from('build/intermediates/packaged-classes/release/') into('release/') include('classes.jar') ///Rename the jar rename('classes.jar', 'AndroidPlugin.jar') } exportJar.dependsOn(deleteOldJar, build)
修改完成后,在顶端会出现Sync提示:
Sync后,打开Studio右侧的Gradle控制台,Refresh。
之后,在SimpleCalc下找到other,之后找到exportJar,点击即可生成jar包。
注意不同版本的Android Studio中,自动生成的jar包目录不同。在Android Studio 3.2中,默认目录为:
build/intermediates/packaged-classes/release/
原:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.polin.simplecalc"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".AdditionActivity" /> <activity android:name=".SubtractionActivity" /> <activity android:name=".MultiplicationActivity" /> <activity android:name=".DevisionActivity"></activity> </application> </manifest>
修改后:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.polin.simplecalc"> <application android:allowBackup="true" android:label="@string/app_name"> <activity android:name=".MainActivity"> <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> <activity android:name=".AdditionActivity" > <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> <activity android:name=".SubtractionActivity" > <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> <activity android:name=".MultiplicationActivity" > <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> <activity android:name=".DevisionActivity"> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> </manifest>
SimpleCalc/app/release下的AndroidPlugin.jar以及src/main下的AndroidManifest.xml就是我们要导入unity中的android原生接口文件。
在根目录下创建Plugins/Android,并将刚才的AndroidPlugin.jar和AndroidManifest.xml复制进去。
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class SimpleCalc : MonoBehaviour { private Button add; private Button subtract; private Button multiply; private Button devide; private Text text; private InputField inputField1; private InputField inputField2; private Button done; private int index = -1; // Use this for initialization void Start () { add = transform.Find("Add").GetComponent<Button>(); subtract = transform.Find("Subtract").GetComponent<Button>(); multiply = transform.Find("Multiply").GetComponent<Button>(); devide = transform.Find("Devide").GetComponent<Button>(); text = transform.Find("Text").GetComponent<Text>(); inputField1 = transform.Find("InputField1").GetComponent<InputField>(); inputField2 = transform.Find("InputField2").GetComponent<InputField>(); done = transform.Find("Done").GetComponent<Button>(); add.onClick.AddListener(Add); subtract.onClick.AddListener(Subtract); multiply.onClick.AddListener(Multiply); devide.onClick.AddListener(Devide); done.onClick.AddListener(Done); } public void Add(){ index = 0; } public void Subtract() { index = 1; } public void Multiply() { index = 2; } public void Devide() { index = 3; } public void Done() { AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity"); currentActivity.Call("Calc", index, Convert.ToDouble(inputField1.text), Convert.ToDouble(inputField2.text)); } public void FromAndroid(string content) { text.text = string.Format("Res: {0}", content); } }
保存场景。
还要注意Unity中Android SDK的版本要高于Android Studio中设置的最低版本。
最后一步,修改一下Build Settings中的Android的Player Settings中的Bundle Identifier为Android studio的包名,查看Android Studio中的AndroidManifest.xml,包名为:com.polin.simplecalc。
测试必须是真机测试,在unity editor player是不能测试的,会报错Exception: JNI: Init’d AndroidJavaClass with null ptr!。
将生成的apk装入真机或虚拟机调试即可实现在Unity中调用Android原生接口。
本文使用网易MuMu模拟器调试,在Android Studio的terminal使用adb连接:
adb connect 127.0.0.1:7555
[注]
在Unity中若打包apk不通过,可在Android Studio的Project视窗下找到gradle.properties,注释掉该句:
org.gradle.jvmargs=-Xmx1536m
或将打包方式由Gradle改为Internal。
参考:link
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。