初入江湖
- 麒麟币
- 38 枚
- 任务币
- 0 枚
- 威望
- 0 点
- 贡献
- 0 点
- 主题
- 9贴
- 在线时间
- 3 小时
|
本帖最后由 2095277517 于 2015-9-15 10:18 编辑
面我先说一下在Unity中结合Android NDK实现本地数据的共享的原理,如下图所示 ,Unity工程加入NDK后工程大致可分为三个部分 Android(JAVA) 、 C/C++(.so)、Unity(C#)它们之间是可以相互调用的,在之前的文章中我向大家介绍了 Android与Unity之间相互调用的原理,Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)。
这种方式只能相互传递String字符串,少量数据传递时可以使用这种方式。如果是大量数据这样就有点限制了,其实我们可以把C/C++的代码做为一个中转站,实现两边的数据引用与共享。
unity3D游戏教程
首先在官网中下载NDK最新的安装包,安装包分为三个版本这里我下载使用的是MAC OS版本,最新版本已经到了R8。
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++文件中间需要使用 \ 隔开。
源自:http://www.youxi.com/game/code/u3d/1402.html
|
|