转自: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-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