对于Android为什么要使用Handle sendMessage()

Cocos2d-x中提供了一个JniHelper类来让我们对Jni进行操作。
 
(PS:弄了一天想自己写代码操作Jni的,但是总是出错,技术差不得不使用Cocos2d-x现成的了)。
 
 
我们有一个 Android工程 :CocosDemoAndroid
 
还有一个Win32工程:Cocos2dDemo.win32
 
这个是必备的。。。
 
 
在C++ Win32工程中有一个Scene,点击按钮调用Jni函数。
 
[cpp]  
void CallJni::getInputCallBack(CCObject* pSender)  
{  
    g_AndroidPlatform.showDialog();  
  
}  
 
这个 g_AndroidPlatform.showDialog(); 在这个函数里面使用JniHelper类来使用Jni。
 
[cpp]  
void AndroidPlatform::showDialog()  
{  
    CCLog("showDialog");  
  
#ifdef ANDROID  
    //下面是利用jnihelper类来调用Android Static  
    JniMethodInfo methodInfo;  //jni函数信息结构体  
    /*getStaticMethodInfo获取到MethodId和ClassId,ClassID通过穿进去的Activity即类名获取,MethodId通过函数名获取*/  
    bool isHave=JniHelper::getStaticMethodInfo(methodInfo,"com/example/cocosdemoandroid/MainActivity","showMessage","()V");  
    if(isHave)  
    {  
        /*调用这个函数*/  
        methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID);  
    }  
  
#endif  
}  
 
C++层关键的代码就是这两个了,在使用JniHelper的时候不要忘记加上头文件
[cpp]  
#ifdef ANDROID  
#include<jni.h>  
#include"platform/android/jni/JniHelper.h"  
#endif  
 
 
下面来看Android层代码了。
 
从上面的C++代码中也能看得出来
 
工程包名 : com.example.cocosdemoandroid
 
Activity:MainActivity
 
[java]  
public class MainActivity extends Cocos2dxActivity {  
  
    public static   Context mContext;  
  
      
      
    /*****消息类型****/  
    private static final int SHOW_MESSAGE = 0;  
      
    private static Handler handler=new Handler()  
    {  
        @Override  
        public void handleMessage(Message msg)  
        {  
            //接受消息然后去做相应的事情  
            if(msg.what==SHOW_MESSAGE)  
            {  
                Log.d("CocosDemoAndroid", String.valueOf(msg.obj));  //获取到Handler传递的参数数据  
                AlertDialog.Builder builder=new Builder(mContext);  
                builder.setTitle("C++调用Android");  
                builder.setMessage("C++调用Android显示弹出框");  
                builder.show();  
            }  
            super.handleMessage(msg);  
        }  
    };  
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        mContext=MainActivity.this;  
    }  
      
      
  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.main, menu);  
        return true;  
    }  
      
      
    public  static void showMessage()  
    {  
        Log.d("showMessage", "showMessage");  
        Message msg=new Message();  
        msg.what=SHOW_MESSAGE;  
        msg.obj="showmessage demos";  //可以传递参数  
        handler.sendMessage(msg);  
    }  
      
    public native int InitJni();  
      
    static  
    {  
        System.loadLibrary("CocosDemo");  
    }  
  
}  
对于Android:
 
为什么要使用Handle sendMessage() ??
 
因为如果直接在showMessage中弹出提示框,会崩溃提示 Can't create handle inside thread that has not called Looper.prepare() 
 
 
 
再附上的Android.mk文件:
 
[cpp]  
LOCAL_PATH := $(call my-dir)  
  
RAKNET_LIB_PATH := ../../../../RakNet_PC-4.08/Android/obj/local/$(TARGET_ARCH_ABI)/libRakNet.a  
  
$(call import-add-path, $(Cocos2d)) \  
$(call import-add-path, $(Cocos2d)\cocos2dx\platform\third_party\android\prebuilt) \  
  
include $(CLEAR_VARS)  
  
LOCAL_MODULE                :=  libRakNet  
LOCAL_SRC_FILES         :=$(RAKNET_LIB_PATH)  
  
include $(PREBUILT_STATIC_LIBRARY)  
  
  
include $(CLEAR_VARS)  
  
LOCAL_MODULE := CocosDemo_shared  
  
LOCAL_CFLAGS                :=  -w -DANDROID -DRAPIDXML_NO_EXCEPTIONS  
  
LOCAL_MODULE_FILENAME := libCocosDemo  
  
LOCAL_SRC_FILES := jni.cpp \  
                    ../../Classes/TristanaLayer.cpp  \  
                    ../../Classes/AppDelegate.cpp \  
                    ../../Classes/HelloWorldScene.cpp   \  
                    ../../Classes/CControlTest.cpp   \  
                    ../../Classes/CocosDemoMenu.cpp   \  
                    ../../Classes/CCScrollViewTest.cpp   \  
                    ../../Classes/CocosRakNet.cpp   \  
                    ../../Classes/MissCardSprite.cpp   \  
                    ../../Classes/MoveWithMouse.cpp   \  
                    ../../Classes/TransCards.cpp   \  
                    ../../Classes/AndroidPlatform.cpp   \  
                    ../../../public/network/MissGameNetWork.cpp \  
                    ../../Classes/CallJni.cpp     
                       
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \  
$(LOCAL_PATH)/../../../public \  
$(LOCAL_PATH)/../../../public/network \  
$(RakNet)/Source \  
$(Cocos2d)/cocos2dx \  
$(Cocos2d)/cocos2dx/include \  
$(Cocos2d)/cocos2dx/kazmath/include \  
$(Cocos2d)/cocos2dx/platform/android \  
$(Cocos2d)/cocos2dx/platform/third_party/android \  
$(Cocos2d)/external \  
$(Cocos2d)/CocosDenshion/include \  
$(Cocos2d)/CocosDenshion/android \  
$(Cocos2d)/extensions \  
$(Cocos2d)/extensions/GUI/CCControlExtension \  
  
LOCAL_STATIC_LIBRARIES  :=  libRakNet  
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static  
  
include $(BUILD_SHARED_LIBRARY)  
  
$(call import-module,CocosDenshion/android) \  
$(call import-module,cocos2dx) \  
$(call import-module,extensions)  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值