自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Unity3D研究之Android實現(xiàn)本地數(shù)據(jù)共享

移動開發(fā) Android 游戲開發(fā)
開始本篇文章之前我先為大家簡單的介紹一下Android NDK編程的原理, 我們知道Android開發(fā)使用JAVA語言來編程它的運行效率要比C/C++低很多,為了讓JAVA語言可以調(diào)用 C/C++ 這時候NDK就出現(xiàn)了,使用DNK可以很方便的實現(xiàn) JAVA 與 C/C++之間的互相調(diào)用。NDK的工作原理是使用谷歌提供的NDK工具將C/C++的代碼編譯成 .so文件,最后使用JAVA代碼與.so文件之間相互調(diào)用。

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

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

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

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

        c.c代碼一共分為兩個方法,先說說方法Java_com_xys_UnityTestActivity_TestAddInt 這個方法是漏給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)用這個方法的,這個方法實現(xiàn)了一個簡單的整形相加的操作。在說說第二個方法int addInt(),這個方法是留給Unity中C#語言調(diào)用的,它的結(jié)構(gòu)與上面不一樣不能在Java代碼中調(diào)用,同樣它也就是實現(xiàn)整形相加的操作。

先是C的文件 c.c

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

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

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

cplus.cpp

 

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

01 #include
02 #include
03  
04 //聲明一個類
05 class  MyClass
06 {
07     public:
08     static float add(float a, float b)
09     {
10         return a + b;
11     }
12  
13 };
14  
15 //外部調(diào)用的方法需要寫在這里
16 extern "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代碼:

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

 OK ,此時C/C++代碼的準(zhǔn)備工作就做完了,下面我們學(xué)習(xí)如何把c.c 與 cplus.cpp 一個C文件與一個C++文件一同打包進(jìn).so文件中。首先打開終端,cd到剛剛創(chuàng)建的jni目錄下,然后執(zhí)行一開始下載的DNK開發(fā)包中的ndk- build命令,你可以直接在android-ndk-r8中找到ndk-build然后拖拽到終端中即可,如果代碼沒有錯誤如圖所示表示.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++,代碼比較簡單在OnCreat()方法中分別調(diào)用C與C++的方法,并且彈出一個Toast顯示在界面中。

UnityTestActivity.java

[代碼]java代碼:

01 package com.xys;
02  
03 import android.os.Bundle;
04 import android.widget.Toast;
05  
06 import com.unity3d.player.UnityPlayerActivity;
07  
08 public class UnityTestActivity extends UnityPlayerActivity
09 {
10  
11     @Override
12     public void onCreate(Bundle savedInstanceState)
13     {
14         super.onCreate(savedInstanceState);
15  
16         //在這里調(diào)用.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插件已經(jīng)制作完畢放在Unity中。目錄結(jié)構(gòu)如下所示。

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

test.cs

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

01 using UnityEngine;
02 using System.Collections;
03 using System.Runtime.InteropServices;
04 public 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         //調(diào)用方法中相加函數(shù)
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 }

所有的工作已經(jīng)做完,我們打包編譯上真機(jī),首先是在Android中調(diào)用.so時 彈出結(jié)果的Toast 。

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

責(zé)任編輯:冰凝兒
相關(guān)推薦

2012-12-24 09:09:27

AndoidUnity3D

2012-12-24 09:19:31

iOSUnity3D

2012-12-24 09:13:23

iOSUnity3D

2012-12-24 09:14:31

ios

2012-12-24 09:11:58

iOSUnity3D

2012-12-24 09:15:57

iOSUnity3D

2012-12-24 09:17:12

iOSUnity3D

2013-04-25 09:56:24

unity3D手機(jī)游戲引擎

2012-12-24 08:48:25

iOSUnity3D

2013-04-25 10:03:07

unity3D手機(jī)游戲引擎

2012-12-24 09:08:14

iOSUnity3D

2013-04-25 13:27:11

unity3D手機(jī)游戲引擎

2012-12-24 08:51:23

iOSUnity3D

2012-12-24 08:46:50

iOSUnity3D

2012-12-24 08:57:35

iOSUnity3D

2012-12-24 09:01:41

iOSUnity3D

2012-12-24 08:45:19

iOSUnity3D

2013-04-25 09:08:39

unity3D手機(jī)游戲引擎

2012-12-24 09:55:15

iOSUnity3D

2013-04-09 13:42:23

Unity3D基礎(chǔ)知識梳理
點贊
收藏

51CTO技術(shù)棧公眾號