Cocos2d-x中提供了一个JniHelper类来让我们对Jni进行操作。
(PS:弄了一天想自己写代码操作Jni的,但是总是出错,技术差不得不使用Cocos2d-x现成的了)。
我们有一个Android工程 :CocosDemoAndroid
还有一个Win32工程:Cocos2dDemo.win32
这个是必备的。。。
在C++ Win32工程中有一个Scene,点击按钮调用Jni函数。
- voidCallJni::getInputCallBack(CCObject*pSender)
- {
- g_AndroidPlatform.showDialog();
-
- }
这个 g_AndroidPlatform.showDialog(); 在这个函数里面
使用JniHelper类来使用Jni
。
- voidAndroidPlatform::showDialog()
- {
- CCLog("showDialog");
-
- #ifdefANDROID
-
- JniMethodInfomethodInfo;
- /*getStaticMethodInfo获取到MethodId和ClassId,ClassID通过穿进去的Activity即类名获取,MethodId通过函数名获取*/
- boolisHave=JniHelper::getStaticMethodInfo(methodInfo,"com/example/cocosdemoandroid/MainActivity","showMessage","()V");
- if(isHave)
- {
- /*调用这个函数*/
- methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID);
- }
-
- #endif
- }
C++层关键的代码就是这两个了,在使用JniHelper的时候不要忘记加上头文件
#include<jni.h>
- #include"platform/android/jni/J
下面来看Android层代码了。
从上面的C++代码中也能看得出来
工程包名 : com.example.cocosdemoandroid
Activity:MainActivity
- publicclassMainActivityextendsCocos2dxActivity{
- staticContextmContext;
-
-
- privatestaticfinalintSHOW_MESSAGE=0;
- staticHandlerhandler=newHandler()
- {
- @Override
- voidhandleMessage(Messagemsg)
- //接受消息然后去做相应的事情
- if(msg.what==SHOW_MESSAGE)
- Log.d("CocosDemoAndroid",String.valueOf(msg.obj));
- AlertDialog.Builderbuilder=newBuilder(mContext);
- builder.setTitle("C++调用Android");
- builder.setMessage("C++调用Android显示弹出框");
- builder.show();
- }
- super.handleMessage(msg);
- };
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- mContext=MainActivity.this;
- }
- booleanonCreateOptionsMenu(Menumenu){
- //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
- getMenuInflater().inflate(R.menu.main,menu);
- returntrue;
- voidshowMessage()
- Log.d("showMessage","showMessage");
- Messagemsg=newMessage();
- msg.what=SHOW_MESSAGE;
- msg.obj="showmessagedemos";
- handler.sendMessage(msg);
- nativeintInitJni();
- static
- System.loadLibrary("CocosDemo");
- }
对于Android:
为什么要使用Handle sendMessage()??
因为如果直接在showMessage中弹出提示框,会崩溃提示Can'tcreatehandleinsidethreadthathasnotcalledLooper.prepare()
最后上效果图
转载来自:http://blog.csdn.net/huutu/article/details/11726675
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|