Unity Android SDK 詳解


一 名詞解釋

(1)SDK :軟件開發工具包(Software Development Kit)應用軟件的開發工具的集合

(2)JDK :Java 開發工具,主要提供基礎類庫,Java編譯器,運行時JVM(Java虛擬機),調試器等

  https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

(3)JRE :Java運行時環境(Java Runtime Environment)Java運行時環境,時JDK的一部分

   

 

(4)Android SDK :安卓軟件開發工具包,在JDK基礎上添加了附加類庫android.jar,提供了Android虛擬機DVM和ART

(5)JNI :Java Native Interface JNI是Java調用Native 語言的一種規范,通過JNI可以使得Java與C/C++機型交互

(6)NDK :Native Develp Kit 官方的解釋如下:Android NDK 是一套允許您使用原生代碼語言(例如C和C++) 實現部分功能的工具集,簡單來說就是Android除了可以用Java來實現,部分功能也可以用C++,NDK不依賴Dalvik Java虛擬機

      NDK主要是把Native語言編譯為動態鏈接庫(.dll文件,.so文件,.jnilib)

(7).NET :Microsoft .NET Framework,.NET 技術框架組成在Windows系統下的具體的實現,簡而言之相當於Java的jdk,即最基礎的開發包,最基礎的框架

(8)Mono :是.net framework的一個開源的、跨平台的實現,並非微軟的產品,它也是有mono編譯器和mono運行時組成的

(9)IL :將.NET代碼轉化為機器語言的一個中間語言,也就是說.NET代碼經過編譯之后不會直接生成機器語言,而是會先生成IL,類似匯編代碼

二 Android程序主要組成

(1)AndroidManifest.xml:對應Unity的路徑Assets/Plugins/AndroidManifest.xml  Android 程序清單文件,包含應用程序名稱、圖標、包名稱、四大組件模塊、權限等

(6)libs:對應Unity的路徑Assets/Plugins/Android  里面存放了Java寫的類庫jar和aar

(7)src/main/assets:對應Unity的路徑Assets/StreamingAssets  外部資源
(8)src/main/Java:Java代碼
(9)src/main/jniLibs:c++編譯的so庫文件
(10)src/main/res:Android資源文件
 

三 Unity調用Android

 

(1)AndroidJavaClass是java.lang.Class通用實例的Unity表示形式

(2)AndroidJavaObject是java.lang.Object的通用實例的Unity表示形式

 

例子:

 

 

 

 (3)Activity和UnityPlayerActivity

https://www.jianshu.com/p/476087b4c087

 

 UnityPlayerActivity是unity Android 包的默認的Activity

(4)application

 

 

 

application可以被繼承,下面是個例子

 

 然后在androidmanifest中引用

 

(5)android 代碼調用Unity函數

UnityPlayer.UnitySendMessage(string gameObject, string runtimeScript, string arg);

 

四 移動MM實例

 application

package com.xx.Racing;
import android.app.Application;
import android.content.Context;
import com.secneo.sdkp.DexHelper;

public class MMApplication
  extends Application
{
  protected void attachBaseContext(Context ctx) {
    super.attachBaseContext(ctx);
    DexHelper.install(this, "mmbilling.3.1.8.jar.protected.jar");
  }
}

  

AndroidforUnity 給unity調用的庫

package com.mm.payforunity;

import android.content.Context;
import mm.purchasesdk.Purchase;

public class PayForUnity
{
  private static final String APPID = "300009265921";
  private static final String APPKEY = "065DF5E770AE73C7ECDE5EE7FA174999";
  private static IAPListener listener;
  
  public static void InitSDK(Context context, String gameObject, String runtimeScript) {
    try {
      Purchase.getInstance().setAppInfo("300009265921", "065DF5E770AE73C7ECDE5EE7FA174999");
    }
    catch (Exception e1) {
      
      e1.printStackTrace();
    } 
    listener = new IAPListener(context, gameObject, runtimeScript);   
    try {
      Purchase.getInstance().init(context, listener);
    }
    catch (Exception e) {
      
      e.printStackTrace();
    } 
  } 
  public static void doPay(Context context, String paycode) {
    try {
      Purchase.getInstance().order(context, paycode, 1, listener);
    }
    catch (Exception e1) {
      
      e1.printStackTrace();
      return;
    } 
  }
}

  

Androidmanifest

<manifest android:versionName="1.0" android:versionCode="1" package="com.gzzhengyou.Racing" xmlns:android="http://schemas.android.com/apk/res/android">

<supports-screens android:anyDensity="true" android:xlargeScreens="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true"/>

<application android:label="@string/app_name" android:icon="@drawable/app_icon" android:name="com.xx.Racing.MMApplication">

<activity android:label="@string/app_name" android:name="com.xx.Racing.UnityPlayerNativeActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="landscape">

<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

</application>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<uses-permission android:name="android.permission.SEND_SMS"/>

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

</manifest>

  

unity call Android

using UnityEngine;
using System;
using System.Collections.Generic;

public class MMBillingAndroid
{
#if UNITY_ANDROID

    private AndroidJavaClass klass = new AndroidJavaClass("com.mm.payforunity.PayForUnity");

    private static MMBillingAndroid _instance;
    public static MMBillingAndroid Instance
    {
        get
        {
		if(_instance==null){
                  _instance = new MMBillingAndroid();
		}
            return _instance;
        }
    }
	public void InitSDK(String gameObject, String runtimeScript)
	{
		AndroidJavaClass unityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
		AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
		curActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            klass.CallStatic("InitSDK", curActivity, gameObject, runtimeScript);
        }));
	}

    public void doPay(string paycode)
    {
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        curActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            klass.CallStatic("doPay", curActivity, paycode);
        }));
    }
#endif
}

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM