91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Unity中Android如何實現本地數據共享

發布時間:2021-11-26 11:36:34 來源:億速云 閱讀:362 作者:柒染 欄目:移動開發

在Unity中Android如何實現本地數據共享,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

下面我先說一下在Unity中結合Android NDK實現本地數據的共享的原理,如下圖所示 ,Unity工程加入NDK后工程大致可分為三個部分 Android(JAVA) 、 C/C++(.so)、Unity(C#)它們之間是可以相互調用的,在之前的文章中我向大家介紹了 Android與Unity之間相互調用的原理,Unity3D研究院之打開Activity與調用JAVA代碼傳遞參數(十八)。這種方式只能相互傳遞String字符串,少量數據傳遞時可以使用這種方式。如果是大量數據這樣就有點限制了,其實我們可以把C/C++的代碼做為一個中轉站,實現兩邊的數據引用與共享。

在Unity中Android如何實現本地數據共享

首先在官網中下載NDK最新的安裝包,安裝包分為三個版本這里我下載使用的是MAC OS版本,最新版本已經到了R8。

下載地址:http://developer.android.com/sdk/ndk/index.html

OK,我們在Eclipse中創建一個Android工程,在res與src平級文件夾目錄下創建一個jni的文件夾。接著在文件夾中創建兩個代碼文件,分別是C與C++還有一個配置文件Android.mk。

      c.c代碼一共分為兩個方法,先說說方法Java_com_xys_UnityTestActivity_TestAddInt 這個方法是漏給Java代碼調用的,jint表示此方法的返回值為整形,數據類型還可以是jlong 、jfloat、jdouble、 jobject、jboolean、jbyte、jchar、jshort,搞程序的一看就應該明白了吧?我就不一一解釋了。 方法名中java開頭是標準用法,com_xys表示當前程序的包名,UnityTestActivity表示當前類,TestAddInt表示方法名,在Android中就是調用這個方法的,這個方法實現了一個簡單的整形相加的操作。在說說第二個方法int addInt(),這個方法是留給Unity中C#語言調用的,它的結構與上面不一樣不能在Java代碼中調用,同樣它也就是實現整形相加的操作。

先是C的文件 c.c

[代碼]c#/cpp/oc代碼:

01#include
02#include
03 
04//Android中java代碼調用此方法
05jint
06Java_com_xys_UnityTestActivity_TestAddInt( JNIEnv* env, jobject thiz ,jint a,jint b)
07{
08    return addInt(a,b);
09}
10 
11//Unity中C#代碼調用此方法
12int addInt(int a, int b)
13{
14    return a + b;
15}

在看看C++文件,它和C文件的調用原理差不多,不過值得注意的是C++中一定要把需要調用的方法寫在extern “C”{ } 中,否則無法調用。

cplus.cpp

[代碼]c#/cpp/oc代碼:

01#include
02#include
03 
04//聲明一個類
05class  MyClass
06{
07    public:
08    static float add(float a, float b)
09    {
10        return a + b;
11    }
12 
13};
14 
15//外部調用的方法需要寫在這里
16extern "C"
17{
18 
19    jfloat
20    Java_com_xys_UnityTestActivity_TestAddFloat( JNIEnv* env, jobject thiz ,jfloat a,jfloat b)
21    {
22        return MyClass::add(a,b);
23    }
24 
25    float addFloat(float a,float b)
26    {
27        return MyClass::add(a,b);
28    }
29 
30}

再看看第三個配置文件,文件中比較重要的兩個變量 LOCAL_MODULE表示生成出的.so的名稱 LOCAL_SRC_FILES 表示需要編譯的文件,如果是多個C/C++文件中間需要使用  \ 隔開。

Android.mk

[代碼]c#/cpp/oc代碼:

01LOCAL_PATH := $(call my-dir)
02 
03include $(CLEAR_VARS)
04 
05LOCAL_MODULE    := xuanyusong
06LOCAL_SRC_FILES := \
07c.c \
08cplus.cpp
09 
10include $(BUILD_SHARED_LIBRARY)

OK ,此時C/C++代碼的準備工作就做完了,下面我們學習如何把c.c 與 cplus.cpp 一個C文件與一個C++文件一同打包進.so文件中。首先打開終端,cd到剛剛創建的jni目錄下,然后執行一開始下載的DNK開發包中的ndk- build命令,你可以直接在android-ndk-r8中找到ndk-build然后拖拽到終端中即可,如果代碼沒有錯誤如圖所示表示.so文件編譯成功。

在Unity中Android如何實現本地數據共享

再看看當前Android工程的目錄結構,libs -> armeabi -> libxuanyusong.so 就是剛剛編譯生成的.so文件,xuanyusong.so前面的lib是系統默認添加的,大家不必驚慌。

在Unity中Android如何實現本地數據共享

下面我們編寫Java代碼,學習如何在java代碼中調用C/C++,代碼比較簡單在OnCreat()方法中分別調用C與C++的方法,并且彈出一個Toast顯示在界面中。

UnityTestActivity.java

[代碼]java代碼:

01package com.xys;
02 
03import android.os.Bundle;
04import android.widget.Toast;
05 
06import com.unity3d.player.UnityPlayerActivity;
07 
08public class UnityTestActivity extends UnityPlayerActivity
09{
10 
11    @Override
12    public void onCreate(Bundle savedInstanceState)
13    {
14        super.onCreate(savedInstanceState);
15 
16        //在這里調用.so中的兩個方法,并且顯示在屏幕中
17        Toast.makeText(getApplicationContext(), "整形  = " + TestAddInt(1,2)+" 浮點型 = " + TestAddFloat(1.5f, 1.1f),
18                 Toast.LENGTH_LONG).show();
19 
20    }  
21 
22    //聲明c.c中的TestAddInt方法
23    public native  int TestAddInt(int a, int b); 
24 
25    //聲明cplus.cpp中的TestAddFloat方法
26    public native  float TestAddFloat(float a, float b); 
27 
28    static
29    {
30        //加載.so文件
31        System.loadLibrary("xuanyusong");
32    } 
33 
34}

好的,我們終于把Android的工程建立完畢。接著我們需要把工程拷貝至Unity的Android插件中, 插件的制作還有誰不會?? 不會的朋友請看之前的文章,這里就不贅述。如下圖所示,Android插件已經制作完畢放在Unity中。目錄結構如下所示。

在Unity中Android如何實現本地數據共享

編寫test.cs腳本,實現通過C#腳本直接訪問libxuanyusong.so文件,直接把test.cs掛在攝像機上。使用 [DllImport ("xuanyusong")]來引入.so 的方法, 這里注意的是 一定要把.so文件名的lib 與后綴.so去掉, 最后將數據通過GUI顯示在屏幕中。

test.cs

[代碼]c#/cpp/oc代碼:

01using UnityEngine;
02using System.Collections;
03using System.Runtime.InteropServices;
04public class test : MonoBehaviour {
05 
06    int i = 0 ;
07    float f = 0.0f;
08 
09    //引用C 、C++中的方法
10    [DllImport ("xuanyusong")]
11    private static extern int addInt(int a,int b);
12    [DllImport ("xuanyusong")]
13    private static extern float addFloat(float a,float b); 
14 
15    void Start ()
16    {
17        //調用方法中相加函數
18        i = addInt (1,2);
19        f = addFloat (1.0f,2.2f);
20 
21    }
22 
23    void OnGUI()
24    {
25 
26        //將相加后的信息顯示在屏幕中
27        if(i !=0)
28        GUILayout.Label(" use  c  =" +  i );
29 
30        if(f !=0.0f)
31        GUILayout.Label(" use  cplus  =" +  f );
32    }
33}

所有的工作已經做完,我們打包編譯上真機,首先是在Android中調用.so時 彈出結果的Toast 。

在Unity中Android如何實現本地數據共享

然后是在Unity中調用.so后通過GUI繪制在屏幕中的結果。

在Unity中Android如何實現本地數據共享

關于在Unity中Android如何實現本地數據共享問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洛川县| 修水县| 梁河县| 江安县| 宁安市| 清水河县| 仁化县| 屏东县| 达拉特旗| 东乡族自治县| 横山县| 贵溪市| 青田县| 左贡县| 偃师市| 皋兰县| 重庆市| 临安市| 汝南县| 通州区| 福清市| 南漳县| 尼玛县| 华坪县| 涞水县| 涡阳县| 南安市| 临颍县| 红安县| 建始县| 岑溪市| 慈利县| 抚州市| 浦东新区| 牡丹江市| 无为县| 凤城市| 秀山| 来宾市| 苍南县| 宝鸡市|