Unity通过Jar包调用Android

我们会需要面对下面几个问题,我们一个一个来解决:

  1. 怎样在Android Studio中打Jar包
  2. 怎样打一个Unity使用的Jar包
  3. 怎样在Unity工程中使用这个Jar包

怎样在Android Studio中打Jar包

在Android Studio中打Jar包首先需要保证你的工程可以顺利编译通过,之后有两种方式:

  • 使用命令行运行gradlew clean build -> jar cvf yourJarName.jar -C build/intermediates/classes/release,之后在app文件夹下就会生成一 个yourJarName.jar
  • 重新设置build.gradle文件,自动生成jar包

这里我们主要来看一看第二种方法.
gradle是一个基于Apachae Ant和Apache Maven概念的项目自动化建构工具.task和project是gradle最主要的东西,所以我们可以建立一个task,调用jar命令帮我们生成jar包,具体代码如下:

1. //定义一个函数,target是生成jar包的文件名,classDir是class文件所在的文件夹
2. def makeJar(String target,String classDir){
3. exec{
4.  executable "jar"//调用jar
5.  args "cvf",target
6.  args "-C", classDir
7.  args "","."
8. }
9. }
10. 
11. //新建一个task,名为buildLib,依赖build(build是一个自带的task)
12. task buildLib(dependsOn:['build'])<<{
13.  makeJar("class.jar","build/intermediates/classes/release")
14. }
15. 
16. task buildJar(){
17.  makeJar("ASTest.jar","build/intermediates/classes/release")
18. }

打开底部任务栏的Terminal,输入gradlew buildLib,执行完之后在你的app文件下就会出现想要的jar包

uniapp中可以调用python抓包吗 uniapp调用jar_android

怎样打一个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文件)

uniapp中可以调用python抓包吗 uniapp调用jar_android_02

开始编写JAVA代码
UnityTestActivity.java

1. package com.xys.unitytestactivity;
2. 
3. import android.content.Context;
4. import android.net.wifi.WifiInfo;
5. import android.net.wifi.WifiManager;
6. import android.os.Bundle;
7. import com.unity3d.player.UnityPlayerActivity;
8. publicclassUnityTestActivityextendsUnityPlayerActivity{
9. /** Called when the activity is first created. */
10. 
11. Context mContext =null;
12. @Override
13. publicvoid onCreate(Bundle savedInstanceState){
14. super.onCreate(savedInstanceState);
15.  mContext =this;
16. }
17. publicstaticint num =0;
18. publicstaticintGetNum()
19. {
20.  num++;
21. return num;
22. }
23. publicint obtainWifiStrength(){
24. WifiManager wifi_servicve =(WifiManager) getSystemService(WIFI_SERVICE);
25. WifiInfo connectionInfo = wifi_servicve.getConnectionInfo();
26. int level = connectionInfo.getRssi();
27. return level;
28. }
29. }

UnityTestActivity是主Activity,Unity程序一启动就会调用这个Activity,他是在AndroridManifest.xml中配置的.他需要继承UnityPlayerActivity,就是我们刚刚引入的class.jar包中的接口类.接着我们配置本程序的AndroidManifest.xml,这个很重要,一定要配置.
AndroidManifest.xml

1. <?xml version="1.0" encoding="utf-8"?>
2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
3. package="com.xys.unitytestactivity">
4. <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
5. <application
6. android:allowBackup="true"
7. android:icon="@drawable/icon"
8. android:label="@string/app_name"
9. 
10. android:supportsRtl="true"
11. android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
12. <activityandroid:name=".UnityTestActivity">
13. <intent-filter>
14. <actionandroid:name="android.intent.action.MAIN"/>
15. <categoryandroid:name="android.intent.category.LAUNCHER"/>
16. </intent-filter>
17. </activity>
18. </application>
19. 
20. </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,否则运行程序后提示找不到类文件

uniapp中可以调用python抓包吗 uniapp调用jar_jar_03


在Unity中新建一个Test.cs

Test.cs

1. usingUnityEngine;
2. usingUnityEngine.UI;
3. usingSystem;
4. publicclassTest:MonoBehaviour
5. {
6. privatestaticfloat xValue;
7. privatestaticfloat yValue;
8. privatestaticfloat zValue;
9. publicText myText;
10. privateString wifiStrength;
11. privateAndroidJavaClass jc;
12. privateAndroidJavaObject jo;
13. voidStart()
14. {
15.  jc =newAndroidJavaClass("com.unity3d.player.UnityPlayer");
16.  jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
17. }
18. // Update is called once per frame
19. voidUpdate()
20. {
21. if(Input.GetKey(KeyCode.Escape))
22. {
23. Application.Quit();
24. }
25.  xValue = jo.CallStatic<int>("GetNum");
26.  yValue = jo.Call<int>("obtainWifiStrength");
27. ChangeWifiStrength();
28. }
29. privatevoidChangeWifiStrength()
30. {
31. if(wifiStrength != yValue.ToString())
32.  wifiStrength = yValue.ToString();
33.  myText.text =string.Format("wifi strength :{0}", wifiStrength);
34. }
35. }

打包注意:Unity中PlayerSetting的Bundle Identifier要与Android工程保持一致,否则无法调用
打包到真机上,现在能够显示WIFI强度了