`
445822357
  • 浏览: 738328 次
文章分类
社区版块
存档分类
最新评论

cocos2d-x Jni c++ java互调 安全刷新UI控件最简单例子(上)

 
阅读更多

转自: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实战 c++卷教程及完整源码下载,使用最新cocos2d-x-3.14版本,在xcode7.3上已编译通过。 解决相关问题 1、解决源程序在高版本上无法编译问题 2、解决源程序中文注释部分,xcode上显示乱码问题 3、根据书籍...

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    Cocos2d-x实战C++卷关东升著完整版pdf

    Cocos2d-x实战C++卷关东升著完整版pdf,含目录,内容完整。

    JNI(c++与Java互调)cocos2d-x_3.x和android studio 3.0

    1.JNI(c++与Java互调)cocos2d-x_3.x和android studio 3.0 2.用的是cocos2d-x原始空项目做的。

    Cocos2d-x实战 C++卷 高清珍藏扫描版

    Cocos2d-x实战 C++卷 高清珍藏扫描版

    Cocos2d-x游戏编程——C++篇 .iso

    Cocos2d-x游戏编程——C++篇(电子工业出版社,徐飞 著)书本配套的光盘代码,

    Cocos2d-x实战 C++卷

    Cocos2d-x实战 C++卷

    cocos2d-x-2.1.5

    cocos2d-x-2.1.5

    Cocos2d-x高级开发教程

    Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...

    cocos2d-x事件类

    在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...

    Cocos2d-x之C++和Lua通信5个入门Demo

    木头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-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...

    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++ 俄罗斯方块源码

    cocos2d-x 3.15 c++俄罗斯方块源码,资源文件和源码一起解压了。 没钱充C币,才出此下册,献丑了。

    cocos2d-x-3.2旧版引擎下载

    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++卷 关东升著 完整版含目录,推荐给大家。

    Cocos2d-x_C++_3.4_48款游戏源码大合集.zip

    Cocos2d-x_C++_3.4,48款游戏源码大合集,Demo 演示代码,简单实现:捕鱼达人,FlappyBird,2048,塔防,微信飞机,超级玛丽,坦克大战,刀塔传奇,防空-合金弹头,城市猎人(跑酷),封神,跑酷30,切水果,奇怪大冒险,翻牌效果,...

    Cocos2D-X游戏开发技术精解

    资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...

    cocos2d-x 通过JNI实现c/c++和Android的java层函数互调-源码

    cocos2d-x 通过JNI实现c/c++和Android的java层函数互调-源码 详情请移步到:http://codingnow.cn/program/992.html

Global site tag (gtag.js) - Google Analytics