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

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

阅读更多

转自:http://blog.csdn.net/liuyuyefz/article/details/17758809

c++ 调用java 篇:


c++调用java。刷新android的Edit View控件



第一步:在引擎库中CocosdxActivity类中把FrameLayout 设置为全局变量


第二步:创建一个文本编辑框的布局文件


参考代码如下:

<?xmlversion="1.0"encoding="utf-8"?>

<EditTextxmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="100dip"

android:layout_height="60dip"

android:layout_marginLeft="20dp"

android:layout_marginTop="200dp"

android:layout_marginRight='20dp'

android:layout_marginBottom='20dp'

>

</EditText>


第三步:在TestJni中申明一个全局的编辑框

参考代码如下:

publicstaticEditTextmyView;


第四步:把刚才申明的文本编辑框放入LayoutInflater中,然后添加到cocos2d-x的framelayout


参考代码如下:

LayoutInflaterinflater= (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

myView=(EditText)LayoutInflater.from(this).inflate(R.layout.myedit,framelayout,false);

myView.addTextChangedListener(watcher);

myView.setMovementMethod(ScrollingMovementMethod.getInstance());

framelayout.addView(myView);



第五步:为文本框添加监听,当文本框状态发生改变时将调用此回调函数



参考代码如下:

TextWatcherwatcher =newTextWatcher()

{

@Override

publicvoidafterTextChanged(Editable s)

{

//TODOAuto-generated method stub

Log.d("TAG","111111");

}

@Override

publicvoidbeforeTextChanged(CharSequence s,intstart,intcount,intafter)

{

//TODOAuto-generated method stub

Log.d("TAG","22222");

}

@Override

publicvoidonTextChanged(CharSequence s,intstart,intbefore,intcount)

{

Log.d("TAG","33==[TextWatcher][onTextChanged]"+s);

}

};

第六步:建立一个消息传递函数,同时创建一个消息接收的handle。用来发送c++过来的消息,回到主线程来通知ui刷新(直接在其它线程刷新主线程ui会崩溃)


参考代码如下:

publicstaticvoidhideAdView(String[] str)

{

mHandler.obtainMessage( 100, str ).sendToTarget();

}

privatestaticHandlermHandler=newHandler()

{

publicvoidhandleMessage(Message msg)

{

switch(msg.what)

{

case100://UPDATE_UI:

{

String[] arrStrings = (String[])msg.obj;

if(arrStrings[0].equals("I'm a titile"))

{

TestJni.this.myView.setText("C++ Change Java EditView string Test!");

}

}

break;

default:

break;

}

}

};



补充:下面是两个改变输入框状态的备用函数

//myView.setBackgroundColor(Color.TRANSPARENT);//改变背景色透明

//framelayout.removeView(myView);//移除控件




C++部分代码

第一步:建立发送信息的Jni


参考代码如下:(下面我将要对这段代码详细讲解)

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#include"platform/android/jni/JniHelper.h"//引入Jni帮助头文件才能正常运行

voidHelloWorld::goJava()

{

JniMethodInfo jmi;

if(JniHelper::getStaticMethodInfo(jmi ,"org/cocos2dx/TestJni/TestJni","hideAdView","([Ljava/lang/String;)V"))

{

jclass str_cls = jmi.env->FindClass("java/lang/String");


jstring str1 = jmi.env->NewStringUTF("I'm a titile");

jstring str2 = jmi.env->NewStringUTF("Are yor exit game?");


jobjectArray arrs = jmi.env->NewObjectArray(2 , str_cls , 0);

jmi.env->SetObjectArrayElement(arrs , 0 , str1);

jmi.env->SetObjectArrayElement(arrs , 1 , str2);

jmi.env->CallStaticVoidMethod(jmi.classID , jmi.methodID , arrs);

}

}

#endif


第一部分:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#endif


这是一个限制平台范围的宏语句,因为我们不希望在ios的代码中出现调用android的代码,所以我们把我们的代码放在如果为android平台上的时候执行,就不会影响其它平台工作。


第二部分:

如下代码讲解:

JniMethodInfo jmi;

if(JniHelper::getStaticMethodInfo(jmi ,"org/cocos2dx/TestJni/TestJni","hideAdView","([Ljava/lang/String;)V"))

1,以上代码具有普遍性,大多数的jni格式都如此

JniMethodInfo表示声明一个方法,


2,下面JniHelper::getStaticMethodInfo我们就会把这个方法赋值给我们要执行的java里面的“hideView”方法


3,"org/cocos2dx/TestJni/TestJni"部分的规律就是

“包名org/cocos2dx/TestJni/要执行方法所在的的类的类名TestJni”

4,"hideAdView" 为java那边继承过来的方法。

5,"([Ljava/lang/String;)V"))

规定返回值的类型


6,

jclass str_cls = jmi.env->FindClass("java/lang/String");

导入jni的String工具库


7,创建两个jni的string

jstring str1 = jmi.env->NewStringUTF("I'm a titile");

jstring str2 = jmi.env->NewStringUTF("Are yor exit game?");

8,初始化创建一个数组

jobjectArray arrs = jmi.env->NewObjectArray(2 , str_cls , 0);

9,为数组添加两个sring

jmi.env->SetObjectArrayElement(arrs , 0 , str1);

jmi.env->SetObjectArrayElement(arrs , 1 , str2);

10,调用java的方法,并且把刚才的数组作为一个参数传递过去

jmi.env->CallStaticVoidMethod(jmi.classID , jmi.methodID , arrs);





最后在我们建立的helloWorld程序的将要被执行到的任意地方调用Jni方法。

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

goJava();

#endif


然后编译c++和android就可以真机调试看到结果了。


分享到:
评论

相关推荐

    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