1. 程式人生 > >unity呼叫android原生介面

unity呼叫android原生介面

這2天在研究unity呼叫android原生的java程式碼,由於對android開發不熟悉,一切都是從頭開始學。最開始連通過搜尋引擎要用什麼關鍵字都不知該如何概括尷尬(現在知道了,即:android plugin for unity)。。。我使用的android開發工具是android studio,但是在網上搜的一大把文章都是用eclipse作為開發工具,它和android studio的一些配置方面差別還是挺大,因此有了這篇文章,記錄下我這個小白的研究過程,也供新手參考。

系統環境

先介紹下我的一些系統環境。  

OS:win7 64位

android SDK:最小SDK 4.0.3,API版本14;最大SDK5.0.1,API版本21。

建立一個andriod studio工程

step1:

step2:

step3:

step4:

經過上面4個步驟,就可以建立一個新的android studio工程。

而我的環境報錯,如下圖所示:


可以修改Gradle Scripts下的build.gradle檔案,將dependencies域下的compile 'com.android.support:appcompat-v7:23.0.1'修改為compile 'com.android.support:appcompat-v7:21.0.3',並且resync一下。具體原因可以百度。

切換下android studio中project的顯示檢視,由Android切換到Project,如下圖:

將unity的jar作為庫加入到android studio

定位到你的unity安裝目錄下的C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\release\bin,裡面又一個Classes.jar檔案,複製它,把把貼上到TestPlugin/app/libs資料夾下,然後右擊Classes.jar,點選 Add as Library,如下圖所示。

這樣我們就可以在android studio中使用com.unity3d.player中的內容,比如com.unity3d.player.UnityPlayerActivity了。

如果按照上面的步驟執行的話,這時候你的TestPlugin/app/build.gradle應該如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.freedom.testplugin"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile files('libs/classes.jar')
}

編寫android原生介面

修改MainActivity.java檔案的內容為:

package com.freedom.testplugin;

import android.content.Intent;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

    public void shareText(String subject, String body) {
        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
        sharingIntent.setType("text/plain");
        sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
        sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, body);
        startActivity(Intent.createChooser(sharingIntent, "Share via"));
    }

}

shareText就是介面函數了,到時候可以在unity中的C#指令碼中直接呼叫它。


使用build.gradle匯出jar作為unity的plugin

修改TestPlugin/app/build.gradle檔案為:

//indicates that this is a library
apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
    sourceSets {
        main {
            //Path to your source code
            java {
                srcDir 'src/main/java'
            }
        }
    }

    defaultConfig {

        minSdkVersion 15
        targetSdkVersion 21

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    lintOptions {
        abortOnError false
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile files('libs/classes.jar')
}

//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/bundles/release/')
    into('release/')
    include('classes.jar')
    ///Rename the jar
    rename('classes.jar', 'AndroidPlugin.jar')
}

exportJar.dependsOn(deleteOldJar, build)

sync一下。

這時候開啟android studio右邊的Gradle控制檯,並refresh all gradle projects。

這時候在TestPlugin/TestPlugin/other下會有一個exportJar。

雙擊它,在run視窗下你會看到BUILD SUCCESSFUL提示,則表示生成jar成功。


在project檢視下,你會看到TestPlugin/app/release/下生成了一個AndroidPlugin.jar檔案。

這個AndroidPlugin.jar檔案就是我們要匯入unity中的android原生介面檔案。

在unity中呼叫jar的介面函式

新建一個名為TestAndroidPlugin的unity工程。在Assets資料夾下建立Plugins資料夾,再在Plugins資料夾下建立Android資料夾,然後將上面的AndroidPlugin.jar檔案複製到Assets/Plugins/Android資料夾下。並且把android studio工程下的TestPlugin/app/src/main/AndroidManifest.xml複製到Assets/Plugins/Android資料夾下,並修改該xml檔案。

如果不修改檔案的話,在unity工程build成apk的時候會報錯,提示:Failed to re-package resources.,即打包資源有錯


根據錯誤提示我們知道,是[email protected]/ic_launcher圖示和[email protected]/AppTheme主題找不到資源,因此我們把unity工程中的Assets/Plugins/Android/AndroidManifest.xml檔案中的android:icon和android:theme兩個域去掉,則xml檔案變為如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.freedom.testplugin" >

    <application
        android:allowBackup="true"
        android:label="@string/app_name">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


在unity工程建立C#檔案test.cs檔案,如下:

using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {
    string subject = "TEST";
    string body = "TEST ANDROID PLUGIN FOR UNITY";

    void OnGUI()
    {
        if (GUILayout.Button("OPEN Activity", GUILayout.Height(100)))
        {
            callAndroidApi();
        }
    }

    public void callAndroidApi()
    {
        AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
        currentActivity.Call("shareText", subject, body);
    }
}
儲存下場景。

最後一步,修改一下Build Settings中的Android的Player Settings中的Bundle Identifier為Android studio的包名,com.freedom.testplugin。


測試

測試必須是真機測試,在unity editor player是不能測試的,會報錯Exception: JNI: Init'd AndroidJavaClass with null ptr!。


將生成的apk包安裝到測試機上,就可以在unity應用中呼叫Android原生的介面了,done!微笑

相關推薦

unity呼叫android原生介面

這2天在研究unity呼叫android原生的java程式碼,由於對android開發不熟悉,一切都是從頭開始學。最開始連通過搜尋引擎要用什麼關鍵字都不知該如何概括(現在知道了,即:android plugin for unity)。。。我使用的android開發工具是and

【每天堅持學一點之unity】1、Unity簡單呼叫Android原生方法的一些記錄

    本文的思路靈感來源於CSDN上的一篇部落格,非常感謝原作者,原文地址為:         https://blog.csdn.net/sinat_23156865/article/de

React-Native之Android:原生介面與React介面的相互呼叫

這裡原生介面是指用佈局檔案實現或Java程式碼實現view的Activity,React介面是指用ReactJS實現的介面的Activity。 從某種角度看,React只是充當了Android裡的view層,因此原生介面與React介面的相互呼叫及資料傳遞同原生介面之間的互

Unity簡單呼叫Android原生方法的一些記錄

    本文的思路靈感來源於CSDN上的一篇部落格,非常感謝原作者,原文地址為:        https://blog.csdn.net/sinat_23156865/article/details/54143064    之前一直是做PC端的一些東西的,所以對於Unity

Unity呼叫iOS原生內購

Unity在5.x以後的版本,都附帶了各種平臺的IAP(內購),網上一搜Unity IAP,就一大堆如何如何接入的教程,據說還挺方便的。本人也是用Unity 5.x,也曾經用了一下Unity的IAP,那為何現在還要討論呼叫iOS原生的IAP呢? 在這裡不得不吐槽一下Unity的IAP,雖然它目的

react native 呼叫Android原生方法

來源:https://www.youtube.com/watch?v=WmJpHHmOKM8  教程:https://www.youtube.com/watch?v=GiUo88TGebs Breaking Down Bridging in React Native by Peggy R

react-native呼叫Android原生UI元件

當react-native的UI元件不能滿足需求時,可以考慮在原生自定UI元件,讓RN呼叫.使用原生UI所考慮的問題: 一.原生UI被呼叫; 二.修改原生UI屬性值; 三.捕捉原生UI的響應; 四.RN向原生UI元件發訊息; 下面貼上程式碼,逐步分析,實現: 1.在原生裡

React-native呼叫Android原生模組

準備工作:具體詳情參考React-Native官方文件 IDE: WebStorm 和Android Studio(webstorm不支援java高亮,所以用AS輔助下) demo放到github上了,有需要的可以參考一下.  下載demo 1.為什麼呼叫原生的一

Unity呼叫Android

unity5.X androidstudio3.1.2 第一步,新建安卓工程 點finish就可以了。 新建module。 選擇Android Library。 此處Pacage name要和unity裡面的包名一致。然後點finish,等

React Native之js呼叫Android原生使用Callback傳遞結果給js

1 問題 上面的文章只是呼叫安卓原生顯示Toast,但是我們一般會需要呼叫安卓的程式碼然後去拿回結果給js,但是我們知道在android層js呼叫的這個函式返回值必須的void,所以我們需要用到Callback,Callback一般用於同步,也就是說直接呼叫

Unity呼叫Android方法實現開啟第三方APK

Android 建立的Android的工程,和平常一樣建立 匯入classes.jar包開啟Windows找到classes.jar檔案複製到app> libs下。我的classes.jar檔案位置為D:\ Unity5.6.0 \ Editor \ Data

ReactNative 呼叫Android 原生(一)——原生模組(一)

前言 React native呼叫Android原生主要2種方式: 1、呼叫原生模組 2、呼叫原生元件 這裡之所以強調有2種方式主要是自己剛開始弄rn調原生的時候感覺很懵,感覺沒有學習的方向,所以提醒一

ReactNative 呼叫Android 原生(一)——原生模組(二)

ReactNative 呼叫Android 原生(一)——原生模組(一):https://blog.csdn.net/danfengw/article/details/83862623 在上次文章中我們只是簡單的嘗試了rn給Android原生傳遞引數呼叫Andr

ReactNative 呼叫Android 原生(二)——原生元件

先說下我遇到的坑: 原本學完React Native呼叫原生模組我覺得挺順利的,也挺容易理解的,覺得呼叫Android原生元件也是不成問題,應該挺快的,結果React Native 調原生元件一直不顯示,在網上找了好多文章對比看,覺得自己程式碼、步驟都沒有問題

React Native呼叫Android原生程式碼實現車牌識別功能【附效果圖附原始碼】

        這段時間研究了下React Native,Facebook推出的,結合了Web應用和Native應用的優勢,可以使用JavaScript來開發iOS和Android原生應用,決定簡單研究下,於是開始搭建環境,編寫HelloWorld,完成後又覺得HelloWo

React Native自定義外掛,呼叫android原生程式碼

Hi,寶寶們,我又來了,16有你,17前行,18怎麼辦?18讓我們一起學習RN吧,hybrid現在是一個前沿,雖然官網說Learn once, write anywhere~~~ 僅需學習一次,編寫任何平臺。但是你不能指望它幹任何事啊,android原生的很多功能還是無法直接使用的,這個時

(八)React Native實現呼叫android原生java方法並實現廣播的傳送和接受

接觸到混合應用開發提議後,首先想到了之前學的ionic,其次便是這兩年火遍全球的RN,由於ionic框架用的angular.js,而且angular1和angular2寫法區別很大,angular2對於初學者還是比較好接受的,但是angular1寫的很亂,程式碼

httpClient及android 原生介面實現下載並顯示圖片

前言:這篇文章用到了Android的handler機制,對於handler機制我也還沒搞得太清楚,只能先把相關的幾個帖子貼上,大家先看看吧,等後面理解了再仔細講講,最後我另外給出了用android原生HttpURLConnection是怎樣來下載並顯示圖片的,但這種方法一般

js呼叫android原生方法,簡單明瞭。

android程式碼: public class MainActivity extends Activity { @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(save

Unity呼叫Android引數為陣列的方法

Unity開發過程中,如果要呼叫Android端的java方法,恰巧該方法的引數是可變引數或者陣列,使用unity的AndroidJavaObject提供的call方法直接傳遞c#陣列,是需要對陣列引數做一下處理。舉例說明:java方法如下:public void addLi