在Unity中Android如何實(shí)現(xiàn)本地?cái)?shù)據(jù)共享,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),賀蘭企業(yè)網(wǎng)站建設(shè),賀蘭品牌網(wǎng)站建設(shè),網(wǎng)站定制,賀蘭網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,賀蘭網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
下面我先說(shuō)一下在Unity中結(jié)合Android NDK實(shí)現(xiàn)本地?cái)?shù)據(jù)的共享的原理,如下圖所示 ,Unity工程加入NDK后工程大致可分為三個(gè)部分 Android(JAVA) 、 C/C++(.so)、Unity(C#)它們之間是可以相互調(diào)用的,在之前的文章中我向大家介紹了 Android與Unity之間相互調(diào)用的原理,Unity3D研究院之打開Activity與調(diào)用JAVA代碼傳遞參數(shù)(十八)。這種方式只能相互傳遞String字符串,少量數(shù)據(jù)傳遞時(shí)可以使用這種方式。如果是大量數(shù)據(jù)這樣就有點(diǎn)限制了,其實(shí)我們可以把C/C++的代碼做為一個(gè)中轉(zhuǎn)站,實(shí)現(xiàn)兩邊的數(shù)據(jù)引用與共享。

首先在官網(wǎng)中下載NDK最新的安裝包,安裝包分為三個(gè)版本這里我下載使用的是MAC OS版本,最新版本已經(jīng)到了R8。
下載地址:http://developer.android.com/sdk/ndk/index.html
OK,我們?cè)贓clipse中創(chuàng)建一個(gè)Android工程,在res與src平級(jí)文件夾目錄下創(chuàng)建一個(gè)jni的文件夾。接著在文件夾中創(chuàng)建兩個(gè)代碼文件,分別是C與C++還有一個(gè)配置文件Android.mk。
c.c代碼一共分為兩個(gè)方法,先說(shuō)說(shuō)方法Java_com_xys_UnityTestActivity_TestAddInt 這個(gè)方法是漏給Java代碼調(diào)用的,jint表示此方法的返回值為整形,數(shù)據(jù)類型還可以是jlong 、jfloat、jdouble、 jobject、jboolean、jbyte、jchar、jshort,搞程序的一看就應(yīng)該明白了吧?我就不一一解釋了。 方法名中java開頭是標(biāo)準(zhǔn)用法,com_xys表示當(dāng)前程序的包名,UnityTestActivity表示當(dāng)前類,TestAddInt表示方法名,在Android中就是調(diào)用這個(gè)方法的,這個(gè)方法實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的整形相加的操作。在說(shuō)說(shuō)第二個(gè)方法int addInt(),這個(gè)方法是留給Unity中C#語(yǔ)言調(diào)用的,它的結(jié)構(gòu)與上面不一樣不能在Java代碼中調(diào)用,同樣它也就是實(shí)現(xiàn)整形相加的操作。
先是C的文件 c.c
[代碼]c#/cpp/oc代碼:
04 | //Android中java代碼調(diào)用此方法 |
06 | Java_com_xys_UnityTestActivity_TestAddInt( JNIEnv* env, jobject thiz ,jint a,jint b) |
11 | //Unity中C#代碼調(diào)用此方法 |
12 | int addInt(int a, int b) |
在看看C++文件,它和C文件的調(diào)用原理差不多,不過(guò)值得注意的是C++中一定要把需要調(diào)用的方法寫在extern “C”{ } 中,否則無(wú)法調(diào)用。
cplus.cpp
[代碼]c#/cpp/oc代碼:
08 | static float add(float a, float b) |
20 | Java_com_xys_UnityTestActivity_TestAddFloat( JNIEnv* env, jobject thiz ,jfloat a,jfloat b) |
22 | return MyClass::add(a,b); |
25 | float addFloat(float a,float b) |
27 | return MyClass::add(a,b); |
再看看第三個(gè)配置文件,文件中比較重要的兩個(gè)變量 LOCAL_MODULE表示生成出的.so的名稱 LOCAL_SRC_FILES 表示需要編譯的文件,如果是多個(gè)C/C++文件中間需要使用 \ 隔開。
Android.mk
[代碼]c#/cpp/oc代碼:
01 | LOCAL_PATH := $(call my-dir) |
05 | LOCAL_MODULE := xuanyusong |
10 | include $(BUILD_SHARED_LIBRARY) |
OK ,此時(shí)C/C++代碼的準(zhǔn)備工作就做完了,下面我們學(xué)習(xí)如何把c.c 與 cplus.cpp 一個(gè)C文件與一個(gè)C++文件一同打包進(jìn).so文件中。首先打開終端,cd到剛剛創(chuàng)建的jni目錄下,然后執(zhí)行一開始下載的DNK開發(fā)包中的ndk- build命令,你可以直接在android-ndk-r8中找到ndk-build然后拖拽到終端中即可,如果代碼沒(méi)有錯(cuò)誤如圖所示表示.so文件編譯成功。

再看看當(dāng)前Android工程的目錄結(jié)構(gòu),libs -> armeabi -> libxuanyusong.so 就是剛剛編譯生成的.so文件,xuanyusong.so前面的lib是系統(tǒng)默認(rèn)添加的,大家不必驚慌。

下面我們編寫Java代碼,學(xué)習(xí)如何在java代碼中調(diào)用C/C++,代碼比較簡(jiǎn)單在OnCreat()方法中分別調(diào)用C與C++的方法,并且彈出一個(gè)Toast顯示在界面中。
UnityTestActivity.java
[代碼]java代碼:
03 | import android.os.Bundle; |
04 | import android.widget.Toast; |
06 | import com.unity3d.player.UnityPlayerActivity; |
08 | public class UnityTestActivity extends UnityPlayerActivity |
12 | public void onCreate(Bundle savedInstanceState) |
14 | super.onCreate(savedInstanceState); |
16 | //在這里調(diào)用.so中的兩個(gè)方法,并且顯示在屏幕中 |
17 | Toast.makeText(getApplicationContext(), "整形 = " + TestAddInt(1,2)+" 浮點(diǎn)型 = " + TestAddFloat(1.5f, 1.1f), |
18 | Toast.LENGTH_LONG).show(); |
23 | public native int TestAddInt(int a, int b); |
25 | //聲明cplus.cpp中的TestAddFloat方法 |
26 | public native float TestAddFloat(float a, float b); |
31 | System.loadLibrary("xuanyusong"); |
好的,我們終于把Android的工程建立完畢。接著我們需要把工程拷貝至Unity的Android插件中, 插件的制作還有誰(shuí)不會(huì)?? 不會(huì)的朋友請(qǐng)看之前的文章,這里就不贅述。如下圖所示,Android插件已經(jīng)制作完畢放在Unity中。目錄結(jié)構(gòu)如下所示。

編寫test.cs腳本,實(shí)現(xiàn)通過(guò)C#腳本直接訪問(wèn)libxuanyusong.so文件,直接把test.cs掛在攝像機(jī)上。使用 [DllImport ("xuanyusong")]來(lái)引入.so 的方法, 這里注意的是 一定要把.so文件名的lib 與后綴.so去掉, 最后將數(shù)據(jù)通過(guò)GUI顯示在屏幕中。
test.cs
[代碼]c#/cpp/oc代碼:
02 | using System.Collections; |
03 | using System.Runtime.InteropServices; |
04 | public class test : MonoBehaviour { |
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); |
17 | //調(diào)用方法中相加函數(shù) |
19 | f = addFloat (1.0f,2.2f); |
28 | GUILayout.Label(" use c =" + i ); |
31 | GUILayout.Label(" use cplus =" + f ); |
所有的工作已經(jīng)做完,我們打包編譯上真機(jī),首先是在Android中調(diào)用.so時(shí) 彈出結(jié)果的Toast 。

然后是在Unity中調(diào)用.so后通過(guò)GUI繪制在屏幕中的結(jié)果。

關(guān)于在Unity中Android如何實(shí)現(xiàn)本地?cái)?shù)據(jù)共享問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
本文標(biāo)題:在Unity中Android如何實(shí)現(xiàn)本地?cái)?shù)據(jù)共享
URL標(biāo)題:http://chinadenli.net/article10/pigido.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站建設(shè)、電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、App開發(fā)
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源:
創(chuàng)新互聯(lián)