Cocos2d-x添加一个按钮弹出一个android对话框

Cocos2d-x中提供了一个JniHelper类来让我们对Jni进行操作。

(PS:弄了一天想自己写代码操作Jni的,但是总是出错,技术差不得不使用Cocos2d-x现成的了)。


我们有一个Android工程 :CocosDemoAndroid

还有一个Win32工程:Cocos2dDemo.win32

这个是必备的。。。


在C++ Win32工程中有一个Scene,点击按钮调用Jni函数。

[cpp]  view plain copy
  1. void CallJni::getInputCallBack(CCObject* pSender)  
  2. {  
  3.     g_AndroidPlatform.showDialog();  
  4.   
  5. }  

这个 g_AndroidPlatform.showDialog(); 在这个函数里面 使用JniHelper类来使用Jni



[cpp]  view plain copy
  1. void AndroidPlatform::showDialog()  
  2. {  
  3.     CCLog("showDialog");  
  4.   
  5. #ifdef ANDROID  
  6.     //下面是利用jnihelper类来调用Android Static  
  7.     JniMethodInfo methodInfo;  //jni函数信息结构体  
  8.     /*getStaticMethodInfo获取到MethodId和ClassId,ClassID通过穿进去的Activity即类名获取,MethodId通过函数名获取*/  
  9.     bool isHave=JniHelper::getStaticMethodInfo(methodInfo,"com/example/cocosdemoandroid/MainActivity","showMessage","()V");  
  10.     if(isHave)  
  11.     {  
  12.         /*调用这个函数*/  
  13.         methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID);  
  14.     }  
  15.   
  16. #endif  
  17. }  

C++层关键的代码就是这两个了,在使用JniHelper的时候不要忘记加上头文件

[cpp]  view plain copy
  1. #ifdef ANDROID  
  2. #include<jni.h>  
  3. #include"platform/android/jni/J


下面来看Android层代码了。

从上面的C++代码中也能看得出来

工程包名 : com.example.cocosdemoandroid

Activity:MainActivity

  1. public class MainActivity extends Cocos2dxActivity {  
  2.   
  3.     public static   Context mContext;  
  4.   
  5.       
  6.       
  7.     /*****消息类型****/  
  8.     private static final int SHOW_MESSAGE = 0;  
  9.       
  10.     private static Handler handler=new Handler()  
  11.     {  
  12.         @Override  
  13.         public void handleMessage(Message msg)  
  14.         {  
  15.             //接受消息然后去做相应的事情  
  16.             if(msg.what==SHOW_MESSAGE)  
  17.             {  
  18.                 Log.d("CocosDemoAndroid", String.valueOf(msg.obj));  //获取到Handler传递的参数数据  
  19.                 AlertDialog.Builder builder=new Builder(mContext);  
  20.                 builder.setTitle("C++调用Android");  
  21.                 builder.setMessage("C++调用Android显示弹出框");  
  22.                 builder.show();  
  23.             }  
  24.             super.handleMessage(msg);  
  25.         }  
  26.     };  
  27.       
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         mContext=MainActivity.this;  
  32.     }  
  33.       
  34.       
  35.   
  36.     @Override  
  37.     public boolean onCreateOptionsMenu(Menu menu) {  
  38.         // Inflate the menu; this adds items to the action bar if it is present.  
  39.         getMenuInflater().inflate(R.menu.main, menu);  
  40.         return true;  
  41.     }  
  42.       
  43.       
  44.     public  static void showMessage()  
  45.     {  
  46.         Log.d("showMessage""showMessage");  
  47.         Message msg=new Message();  
  48.         msg.what=SHOW_MESSAGE;  
  49.         msg.obj="showmessage demos";  //可以传递参数  
  50.         handler.sendMessage(msg);  
  51.     }  
  52.       
  53.     public native int InitJni();  
  54.       
  55.     static  
  56.     {  
  57.         System.loadLibrary("CocosDemo");  
  58.     }  
  59.   
  60. }  

对于Android:

为什么要使用Handle sendMessage() ??

因为如果直接在showMessage中弹出提示框,会崩溃提示 Can't create handle inside thread that has not called Looper.prepare() 

最后上效果图


转载来自:http://blog.csdn.net/huutu/article/details/11726675

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值