CG游麟网官方站
查看: 3606|回复: 16

Android NDK实现本地数据的共享的原理

[复制链接]

9

主题

9

帖子

47

积分

初入江湖

Rank: 1

麒麟币
38
任务币
0
威望
0
贡献
0
主题
9
在线时间
3 小时
发表于 2015-9-14 16:03:50 | 显示全部楼层 |阅读模式
本帖最后由 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++的代码做为一个中转站,实现两边的数据引用与共享。
0.jpg 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

楼主热帖
回复

使用道具 举报

5

主题

178

帖子

1494

积分

名动江湖

Rank: 6Rank: 6

麒麟币
1311
任务币
0
威望
0
贡献
6
主题
5
在线时间
25 小时

最佳新人

QQ
发表于 2015-9-14 16:17:30 | 显示全部楼层
真的非常棒!
回复 支持 反对

使用道具 举报

0

主题

4493

帖子

4934

积分

誉满一方

Rank: 8Rank: 8

麒麟币
388
任务币
170
威望
0
贡献
0
主题
0
在线时间
876 小时
发表于 2015-9-15 09:31:44 | 显示全部楼层
我一直默默的支持楼主
回复 支持 反对

使用道具 举报

2

主题

6279

帖子

6918

积分

四方传颂

Rank: 9Rank: 9Rank: 9

麒麟币
549
任务币
50
威望
0
贡献
22
主题
2
在线时间
304 小时

忠实会员最佳新人

发表于 2015-9-15 11:14:15 | 显示全部楼层
真的很漂亮~我喜欢!
回复 支持 反对

使用道具 举报

2

主题

6279

帖子

6918

积分

四方传颂

Rank: 9Rank: 9Rank: 9

麒麟币
549
任务币
50
威望
0
贡献
22
主题
2
在线时间
304 小时

忠实会员最佳新人

发表于 2015-9-15 12:47:19 | 显示全部楼层
真的很漂亮~我喜欢!
回复 支持 反对

使用道具 举报

17

主题

2841

帖子

1万

积分

无人不晓

Rank: 12Rank: 12Rank: 12

麒麟币
11918
任务币
300
威望
0
贡献
0
主题
17
在线时间
336 小时

最佳新人忠实会员

发表于 2015-9-16 12:34:52 | 显示全部楼层
感谢楼主分享!!!
回复 支持 反对

使用道具 举报

3

主题

2630

帖子

3482

积分

大名鼎鼎

Rank: 7Rank: 7Rank: 7

麒麟币
852
任务币
0
威望
0
贡献
0
主题
3
在线时间
302 小时

最佳新人忠实会员

发表于 2016-5-8 15:24:11 | 显示全部楼层
一如既往的支持楼主
回复 支持 反对

使用道具 举报

0

主题

4341

帖子

1万

积分

无人不晓

Rank: 12Rank: 12Rank: 12

麒麟币
9355
任务币
0
威望
0
贡献
0
主题
0
在线时间
94 小时
发表于 2018-2-21 17:08:08 | 显示全部楼层
我一直默默的支持楼主
回复 支持 反对

使用道具 举报

0

主题

3665

帖子

1万

积分

名扬四海

Rank: 11Rank: 11Rank: 11Rank: 11

麒麟币
8881
任务币
0
威望
0
贡献
0
主题
0
在线时间
64 小时
发表于 2018-2-21 17:10:59 | 显示全部楼层
我一直默默的支持楼主
回复 支持 反对

使用道具 举报

8

主题

1万

帖子

3万

积分

垂名青史

Rank: 16Rank: 16Rank: 16Rank: 16

麒麟币
19974
任务币
0
威望
0
贡献
0
主题
8
在线时间
556 小时
发表于 2018-4-11 09:30:20 | 显示全部楼层
我一直默默的支持楼主
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
客服QQ:
47413829
新QQ群:
418757022
在线时间:周一至周五
9:00-22:00 Email:
47413829@qq.com
举报:网盘资源失效
在线客服
快速回复 返回顶部 返回列表