AndroidStudio给Unity打jar包

环境:

AndroidStudio2.0

Unity4.68


AS打jar包

新建空工程

删除无用的MainActivity等。

新建Module

Module选择Android Library,起名为unitylib

向Module中引入Unity的classes.jar


不同版本unity   classes.jar的位置
...........\Unity468\Editor\Data\PlaybackEngines\androidplayer\release\bin
...........\Unity53\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes


把unity classes.jar直接放入新建module文件下的libs中

把classes.jar引入,具体过程为

选择unitylib,点击+号,确定引入了classes.jar后点击ok保存,退出Project Structure界面


想删除新建的module,需要在ProjectStructure中先点-号,然后回到把unitylib delete调,然后在回到工程中把unitylib整个delete掉

打包内容填写

这里要打包一个MainActivity,所以在module中新建一个MainActivity.Java



MainActivity内容为

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.n.unitylib;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.res.Configuration;  
  5. import android.graphics.PixelFormat;  
  6. import android.support.v7.app.AppCompatActivity;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9. import android.view.KeyEvent;  
  10. import android.view.MotionEvent;  
  11. import android.view.Window;  
  12. import android.view.WindowManager;  
  13.   
  14. import com.unity3d.player.UnityPlayer;  
  15.   
  16. public class MainActivity extends Activity {  
  17.   
  18.     protected UnityPlayer mUnityPlayer;     // don't change the name of this variable; referenced from native code  
  19.   
  20.     // Setup activity layout  
  21.     @Override protected void onCreate (Bundle savedInstanceState)  
  22.     {  
  23.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  24.         super.onCreate(savedInstanceState);  
  25.   
  26.         getWindow().takeSurface(null);  
  27.         getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy  
  28.   
  29.         mUnityPlayer = new UnityPlayer(this);  
  30.         if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar"true))  
  31.             getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  32.                     WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  33.   
  34.         setContentView(mUnityPlayer);  
  35.         mUnityPlayer.requestFocus();  
  36.     }  
  37.   
  38.     // Quit Unity  
  39.     @Override protected void onDestroy ()  
  40.     {  
  41.         mUnityPlayer.quit();  
  42.         super.onDestroy();  
  43.     }  
  44.   
  45.     // Pause Unity  
  46.     @Override protected void onPause()  
  47.     {  
  48.         super.onPause();  
  49.         mUnityPlayer.pause();  
  50.     }  
  51.   
  52.     // Resume Unity  
  53.     @Override protected void onResume()  
  54.     {  
  55.         super.onResume();  
  56.         mUnityPlayer.resume();  
  57.     }  
  58.   
  59.     // This ensures the layout will be correct.  
  60.     @Override public void onConfigurationChanged(Configuration newConfig)  
  61.     {  
  62.         super.onConfigurationChanged(newConfig);  
  63.         mUnityPlayer.configurationChanged(newConfig);  
  64.     }  
  65.   
  66.     // Notify Unity of the focus change.  
  67.     @Override public void onWindowFocusChanged(boolean hasFocus)  
  68.     {  
  69.         super.onWindowFocusChanged(hasFocus);  
  70.         mUnityPlayer.windowFocusChanged(hasFocus);  
  71.     }  
  72.   
  73.     // For some reason the multiple keyevent type is not supported by the ndk.  
  74.     // Force event injection by overriding dispatchKeyEvent().  
  75.     @Override public boolean dispatchKeyEvent(KeyEvent event)  
  76.     {  
  77.         if (event.getAction() == KeyEvent.ACTION_MULTIPLE)  
  78.             return mUnityPlayer.injectEvent(event);  
  79.         return super.dispatchKeyEvent(event);  
  80.     }  
  81.   
  82.     // Pass any events not handled by (unfocused) views straight to UnityPlayer  
  83.     @Override public boolean onKeyUp(int keyCode, KeyEvent event)     { return mUnityPlayer.injectEvent(event); }  
  84.     @Override public boolean onKeyDown(int keyCode, KeyEvent event)   { return mUnityPlayer.injectEvent(event); }  
  85.     @Override public boolean onTouchEvent(MotionEvent event)          { return mUnityPlayer.injectEvent(event); }  
  86.     /*API12*/ public boolean onGenericMotionEvent(MotionEvent event)  { return mUnityPlayer.injectEvent(event); }  
  87.   
  88.   
  89.     public static void Test()  
  90.     {  
  91.         Log.e("nafio","success!");  
  92.     }  
  93. }  

AndroidManifest.xml内容为

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     package="com.n.unitylib"  
  5.     android:installLocation="preferExternal"  
  6.     android:versionCode="1"  
  7.     android:versionName="1.0">  
  8.     <supports-screens  
  9.         android:smallScreens="true"  
  10.         android:normalScreens="true"  
  11.         android:largeScreens="true"  
  12.         android:xlargeScreens="true"  
  13.         android:anyDensity="true"/>  
  14.   
  15.     <application  
  16.         android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  
  17.         android:label="@string/app_name"  
  18.         >  
  19.         <activity android:name=".MainActivity"  
  20.             android:label="@string/app_name">  
  21.             <intent-filter>  
  22.                 <action android:name="android.intent.action.MAIN" />  
  23.                 <category android:name="android.intent.category.LAUNCHER" />  
  24.                 <category android:name="android.intent.category.LEANBACK_LAUNCHER" />  
  25.             </intent-filter>  
  26.             <meta-data android:name="unityplayer.UnityActivity" android:value="true" />  
  27.             <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />  
  28.         </activity>  
  29.     </application>  
  30. </manifest>  



配置gradle打包参数

在module的build.gradle最后添加

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. task makeJar(type: Copy) {  
  2.     delete 'build/libs/unitylib.jar'  
  3.     from('build/intermediates/bundles/release/')  
  4.     into('build/libs/')  
  5.     include('classes.jar')  
  6.     rename('classes.jar', 'unitylib.jar')  
  7. }  
  8.   
  9. makeJar.dependsOn(build)  


打jar包

然后在Terminal中输入gradlew makejar

第一次运行Androidstudio可能会更新gradle,20-30分钟,更新完会自动打jar包


jar包位置在



android调试module

module用来打包,如果要调试

把module中的build.gradle中

apply plugin: 'com.android.library'
改为
apply plugin: 'com.android.application'

然后同步下gradle module就是普通工程了




Unity调用

新建空工程
在Assets下新建Plugins/Android/
把打出的unitylib.jar和对应的AndroidManifest.xml(这个从哪copy都可以,单独写都可以,只要内容对就行)

新建脚本,随便挂一个节点上
[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class TestAS : MonoBehaviour {  
  5.     private AndroidJavaObject _java;  
  6.     public AndroidJavaObject Java  
  7.     {  
  8.         get  
  9.         {  
  10.             if (_java == null)  
  11.             {  
  12.                 var javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");  
  13.                 _java = javaClass.GetStatic<AndroidJavaObject>("currentActivity");  
  14.             }  
  15.             return _java;  
  16.         }  
  17.     }  
  18.     // Use this for initialization  
  19.     void Start () {  
  20.         Debug.Log("nafio-----START");  
  21.         Java.CallStatic("Test");  
  22.         Debug.Log("nafio-----END");  
  23.     }  
  24.       
  25.     // Update is called once per frame  
  26.     void Update () {  
  27.       
  28.     }  
  29. }  


打包时注意一点,包名保持跟jar包中的包名一致(如果jar包中包含的不是主Acticity,而是其他java类,应该不一致也可以)


打apk出来,运行输出  android中写的log  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Log.e("nafio","success!");  



遇到问题记录

Lint found errors in the project; aborting build


解决办法
文件build.gradle,添加如下信息
android {
   lintOptions {
       abortOnError false
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值