Cocos2d-x C++调用Android弹出提示框

来源:互联网 发布:win10看图软件 编辑:程序博客网 时间:2024/06/07 06:51
Cocos2d-x C++调用Android弹出提示框
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)  
 
转载地址:http://www.2cto.com/kf/201309/244504.html
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 法院胜诉不执行怎么办 申请执行立案后怎么办 民事判决书下来了怎么办 民事判决书下来以后怎么办 对方没能力赔偿怎么办 判决后无力赔偿怎么办 判决下来没钱还怎么办 如果在法院签字怎么办 法院判决书不签字怎么办 起诉判决不执行怎么办 判决被告还钱怎么办 判决后没钱还怎么办 二审不开庭判决怎么办 二审送传票应怎么办 船舶发电机电压过高怎么办 高层楼水压低怎么办 高楼层二次供水怎么办 汽车水箱坏了怎么办 住宾碰坏马桶水箱盖怎么办? 盆栽草莓肥害怎么办 绿萝叶尖发黄怎么办 民事判决生效后怎么办 劳动合同写错了怎么办 白条过期没还款怎么办 体内重金属砷超标怎么办 孕妇闻了水银怎么办 孕妇吸入汞蒸气怎么办 电瓶电极柱腐蚀怎么办 电子血压计千帕怎么办 孕妇铅汞超标怎么办 吸入性水银中毒怎么办 水银沾衣服上怎么办 体内铅汞超标怎么办 人被核辐射后怎么办 在酒店遗失物品怎么办 有客人找总经理怎么办 乳腺增生喂奶痛怎么办 税务发票遗失了怎么办 神舟笔记本电脑开不了机怎么办 不当得利拒不返还怎么办 对方科目有两个怎么办