转自:http://blog.csdn.net/liuyuyefz/article/details/17754025
上篇
Java调用c++,刷新CCLabelTTF
首先我们先以引擎2.2.1为例子来新建一个TestJni的项目
创建方式如下:
python create_project.py -project TestJni -package org.cocos2dx.TestJni-language cpp
如果你对创建项目有什么疑问,可以参考这遍文章:
http://blog.csdn.net/liuyuyefz/article/details/9129525
我们第一个目标是:通过java层来给C++层发送信号,然后来让我们的cocos2d-x的HelloWorld项目中的CCLabelTTF来改变显示的内容。
请相信我这只需要非常简单的几步操作。然后奇迹就会降临。
我们先来看看我们熟悉的cocos2d-x的c++代码需要添加和修改些什么。
首先我们在 HelloWorldScene.cpp 里搜索一下这段代码:
CCLabelTTF *pLabel=CCLabelTTF::create("Hello World","Arial", 24);
这是创建一个Hello World的Label,也就是我们这次的主角。
我们想要在java处通过调用一个函数,来改变这个label的值。所以我们必须把pLabel重新定义为一个全局变量。
你需要把上面那段代码替换成如下代码
pLabel=CCLabelTTF::create("Hello World","Arial", 24);
同时在HelloWorldScene.h中的
public:
下添加如下代码
cocos2d::CCLabelTTF *pLabel;
第二步:我们在 HelloWorldScene.cpp 里的空白部分添加如下代码:
这个是用来改变pLabel中的显示内容
std::stringHelloWorld::changeStr =" ";//添加一个全局static变量表示状态,来接收java传过来的字符串
voidHelloWorld::changeText(floatt)//添加一个方法来改变label的显示内容
{
if(HelloWorld::changeStr.compare(" ") !=0)//当java没有传内容过来的时候HelloWorld::changeStr为空
{
pLabel->setString(HelloWorld::changeStr.c_str());
HelloWorld::changeStr=" ";
}
}
同时在HelloWorldScene.h中的
public:
下添加如下代码
staticstd::stringchangeStr;
voidchangeText(floatt);
到此处你可以试试看在HelloWorldScene.cpp
的
boolHelloWorld::init(){
....
}
函数中的最下面添加如下代码,并且运行看看
CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(HelloWorld::changeText),this, 0,false);//添加一个计时器,来动态每一帧检测一下是java有传文本过来。
到此位置运行代码,你可以看到项目跑起来了,但是还是什么都没有改变。
这个是因为我们还没有从java端来传一个字符串来通知cocos2d-x的label改变。代价也许觉得很奇怪为什么我们要开一个scheduler来不停的检测java是否有传文本过来。因为
opengl的限制,ui只能在主线程中刷新。而我们传过来的文本是通过另外一条线程。所以我们必须要在主线程中通过schedule来检测改变UI控件。
第三步:我们在 HelloWorldScene.cpp 里的空白部分添加Jni代码:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include<jni.h>
extern
"C"
{
voidJava_org_cocos2dx_TestJni_TestJni_changeTTFLabel(JNIEnv* env, jobject thiz,jstring textStr)
{
//这里java调用changeTTFLabel("Test MyLabel Change!");,这里就会被调用。jint
constchar* str;
str = env->GetStringUTFChars(textStr,false);
std::string tempStr(str);
HelloWorld::changeStr = tempStr;
}
}
#endif
第一部分:
我们来分布将讲解以上代码
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#endif
以上这段代码是限定平台。这段代码之间的代码只有在编译android项目的时候才会被调用到。因为调用ios项目的时候我们不能够调用到这个之间的代码,否则会编译出错通不过。
第二部分:
必须加上extern “C”,声明以c语言的方式进行编译,因为c++和c在编译时生成的函数签名不一样,可以在网上查找相关资料,不然运行的时候会出现链接错误。
第三部分:
voidJava_org_cocos2dx_TestJni_TestJni_changeTTFLabel(JNIEnv* env, jobject thiz,jstring textStr)
这边的格式规律为
Java_签名(org_cocos2dx_TestJni_)_类名(TestJni)_changeTTFLabel(在该类下要调用的函数)
下面这一段的规律
(JNIEnv* env, jobject thiz,jstring textStr)
前面两个为必写,最后jstring textStr为要传的参数。
参数可以是jstring 或者 jint 他们分别对应了java的String 或者int类型
第四部分:
constchar* str;
str = env->GetStringUTFChars(textStr,false);
jstring转化为c++的constchar*
在此c++部分的代码我们已经全部完成。
第四步:我们在eclipse中打开如下页面:
在进入这个步骤之前你要先配置好所有eclipse下编译cocos2dx android环境。
参考这篇文章:http://blog.csdn.net/jackystudio/article/details/12419387
然后在
publicclassTestJniextendsCocos2dxActivity{
......
}
函数中最下面添加如下代码。
privatestaticnativevoidchangeTTFLabel(String textStr);//这个是作为中介接口,提供java调用c++里面的同名JNI函数的。
最后在
protectedvoidonCreate(Bundle savedInstanceState){
......
}
函数中最下面添加如下代码。调用
changeTTFLabel("Test MyLabel Change!");
第五步:我们需要在真机上编译c++和java代码才可以看到最后的结果。c++代码的编译
我们先进入
cocos2d-x2.2.0/projects/TestJni/proj.android
文件夹下面,编译
build_native.sh
的shell脚本来编译c++
windows下你需要有cywin来模拟linux环境
mac下面直接
./build_native.sh即可。编译成功大致为如下画面。如果编译结果中有erro,你要注意查看说明来看看c++什么地方出错了。
然后在eclipse里面编译android的java部分
方法是eclipse-》clean
最后连上真机:调试看结果label被从Hello World改变为Test MyLabel Change!
分享到:
相关推荐
cocos2d-x实战 c++卷教程及完整源码下载,使用最新cocos2d-x-3.14版本,在xcode7.3上已编译通过。 解决相关问题 1、解决源程序在高版本上无法编译问题 2、解决源程序中文注释部分,xcode上显示乱码问题 3、根据书籍...
资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...
Cocos2d-x实战C++卷关东升著完整版pdf,含目录,内容完整。
1.JNI(c++与Java互调)cocos2d-x_3.x和android studio 3.0 2.用的是cocos2d-x原始空项目做的。
Cocos2d-x实战 C++卷 高清珍藏扫描版
Cocos2d-x游戏编程——C++篇(电子工业出版社,徐飞 著)书本配套的光盘代码,
Cocos2d-x实战 C++卷
cocos2d-x-2.1.5
Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...
在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...
木头Cocos2d-x教程 Lua篇 Demo源代码。 教程地址: 第1章:http://blog.csdn.net/musicvs/article/details/8440707 第2章:http://blog.csdn.net/musicvs/article/details/8440919 第3章:...
资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...
cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...
cocos2d-x 3.15 c++俄罗斯方块源码,资源文件和源码一起解压了。 没钱充C币,才出此下册,献丑了。
cocos2d-x-3.2下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656
Cocos2d-x实战C++卷 关东升著 完整版含目录,推荐给大家。
Cocos2d-x_C++_3.4,48款游戏源码大合集,Demo 演示代码,简单实现:捕鱼达人,FlappyBird,2048,塔防,微信飞机,超级玛丽,坦克大战,刀塔传奇,防空-合金弹头,城市猎人(跑酷),封神,跑酷30,切水果,奇怪大冒险,翻牌效果,...
资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...
cocos2d-x 通过JNI实现c/c++和Android的java层函数互调-源码 详情请移步到:http://codingnow.cn/program/992.html