Unity通过Jar包调用Android
我们会需要面对下面几个问题,我们一个一个来解决:
- 怎样在Android Studio中打Jar包
- 怎样打一个Unity使用的Jar包
- 怎样在Unity工程中使用这个Jar包
怎样在Android Studio中打Jar包
在Android Studio中打Jar包首先需要保证你的工程可以顺利编译通过,之后有两种方式:
- 使用命令行运行gradlew clean build -> jar cvf yourJarName.jar -Cbuild/intermediates/classes/release,之后在app文件夹下就会生成一个yourJarName.jar
- 重新设置build.gradle文件,自动生成jar包
这里我们主要来看一看第二种方法.
gradle是一个基于Apachae Ant和Apache Maven概念的项目自动化建构工具.task和project
是gradle最主要的东西,所以我们可以建立一个task,调用jar命令帮我们生成jar包,具体代码如下:
//定义一个函数,target是生成jar包的文件名,classDir是class文件所在的文件夹
defmakeJar(String target,String classDir){
exec{
executable"jar"//调用jar
args"cvf",target
args"-C", classDir
args"","."
}
}
//新建一个task,名为buildLib,依赖build(build是一个自带的task)
task buildLib(dependsOn:['build'])<< {
makeJar("class.jar","build/intermediates/classes/release")
}
task buildJar() {
makeJar("ASTest.jar","build/intermediates/classes/release")
}
打开底部任务栏的Terminal,输入gradlew buildLib,执行完之后在你的app文件下就会出现想要的jar包
怎样打一个Unity使用的Jar包
使用Android Studio新建一个空工程,首先我们需要将接口class.jar引入到工程libs文件夹下.接口包所在地C:\Program Files\Unity5.2.3\Editor\Data\PlaybackEngines\androidplayer\Variations\mono\Release\Classes\class.jar,工程目录结构如下图:
(按照上一节的方法设置build.gradle文件)
开始编写JAVA代码
UnityTestActivity.java
package com.xys.unitytestactivity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;
public class UnityTestActivity extends UnityPlayerActivity {
/** Called when the activity is first created. */
Context mContext = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
}
public static int num = 0;
public static int GetNum()
{
num++;
return num;
}
public int obtainWifiStrength(){
WifiManager wifi_servicve = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo connectionInfo = wifi_servicve.getConnectionInfo();
int level = connectionInfo.getRssi();
return level;
}
}
UnityTestActivity是主Activity,Unity程序一启动就会调用这个Activity,他是在AndroridManifest.xml中配置的.他需要继承UnityPlayerActivity,就是我们刚刚引入的class.jar包中的接口类.接着我们配置本程序的AndroidManifest.xml
,这个很重要,一定要配置.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xys.unitytestactivity">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<activity android:name=".UnityTestActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
之后按照上一节的打包流程,打出Jar包.
注意:在这有一个坑,需要将build\intermediates\classes\release\com\你的包名\你的工程名 下面的R开头的class文件全部删掉,不然在Unity中使用打包时会报错
怎样在Unity工程中使用这个Jar包
开始创建Unity工程.如图所示,Plugins->Android,将AndroidMinifest.xml放入这一层文件夹并建立res文件夹(下面放打包时需要用到的资源,如APP的图标等)和bin文件夹(放刚刚生成的.jar包)
注意:Jar包的名字可以随便修改,但是jar包里面必须是com\你的包名\你的工程名\你需要的class,否则运行程序后提示找不到类文件
在Unity中新建一个Test.cs
Test.cs
using UnityEngine;
using UnityEngine.UI;
using System;
public class Test : MonoBehaviour
{
private static float xValue;
private static float yValue;
private static float zValue;
public Text myText;
private String wifiStrength;
private AndroidJavaClass jc;
private AndroidJavaObject jo;
void Start()
{
jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.Escape))
{
Application.Quit();
}
xValue = jo.CallStatic<int>("GetNum");
yValue = jo.Call<int>("obtainWifiStrength");
ChangeWifiStrength();
}
private void ChangeWifiStrength()
{
if (wifiStrength != yValue.ToString())
wifiStrength = yValue.ToString();
myText.text = string.Format("wifi strength :{0}", wifiStrength);
}
}
打包注意:Unity中PlayerSetting的Bundle Identifier要与Android工程保持一致,否则无法调用
打包到真机上,现在能够显示WIFI强度了
网友评论