Cocos2d-x 调用 Android 代码的后续

cocos2d-x和android相互调用 1.准备环境工作,在项目目录下新建自己的MyApplication,MyActivity,MyAllSdk,MyBroadcastReceiver的java文件:在MyApplication.Java中添加代码:package com.OYHP; import android.app.Application; public class MyApplication extends Applica... 阅读详情

我发现简单的调用没有任何问题。 但是只要是调用了UI元素,比如显示个消息框什么的,程序立即就挂了。后来发现还是得上Google(鄙视一下百度同学),在StackOverFlow上面找到了一篇这样的回答

The problem was that when calling back from JNI the application wasn't on UI Thread so the dialog was never shown. To fix it I used a Handler (on Activity):

public final Handler dialogHandler = new Handler(){     
    public void handleMessage(Message msg){
        showDialog(SOME_ID);
    }   
};
So instead of directly call showDialog() I do it by calling dialogHandler.sendMessage().

翻译过来,就是说,当前程序的主线程没有在UI上。所以对话框当然显示不出来。这个时候需要一个Handler和UI线程进行异步通信。具体的机制我也没太明白。但是好歹解决了问题。代码如下

/****************************************************************************
Copyright (c) 2010-2012 cocos2d-x.org

http://www.cocos2d-x.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package com.chen;

import java.lang.ref.WeakReference;

import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxEditText;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.lib.Cocos2dxRenderer;

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ConfigurationInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import cn.game189.sms.SMS;
import cn.game189.sms.SMSListener;

public class FuckAndroid extends Cocos2dxActivity implements SMSListener{
    // 用来获得Activity的Object类型的实例,供JNI调用
	public static FuckAndroid instance = null;
    public static FuckAndroid getInstance(){
    	if (instance == null){
    		instance = new FuckAndroid();
    	}
    	return instance;
    }

    public static Handler handler = null;
    
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		
		handler = new PayHandler(this);
		
		if (detectOpenGLES20()) {
			// get the packageName,it's used to set the resource path
			String packageName = getApplication().getPackageName();
			super.setPackageName(packageName);
			
            // FrameLayout
            ViewGroup.LayoutParams framelayout_params =
                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
                                           ViewGroup.LayoutParams.FILL_PARENT);
            FrameLayout framelayout = new FrameLayout(this);
            framelayout.setLayoutParams(framelayout_params);

            // Cocos2dxEditText layout
            ViewGroup.LayoutParams edittext_layout_params =
                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
                                           ViewGroup.LayoutParams.WRAP_CONTENT);
            Cocos2dxEditText edittext = new Cocos2dxEditText(this);
            edittext.setLayoutParams(edittext_layout_params);

            // ...add to FrameLayout
            framelayout.addView(edittext);

            // Cocos2dxGLSurfaceView
	        mGLView = new Cocos2dxGLSurfaceView(this);

            // ...add to FrameLayout
            framelayout.addView(mGLView);

	        mGLView.setEGLContextClientVersion(2);
	        mGLView.setCocos2dxRenderer(new Cocos2dxRenderer());
            mGLView.setTextField(edittext);

            // Set framelayout as the content view
			setContentView(framelayout);
		}
		else {
			Log.d("activity", "don't support gles2.0");
			finish();
		}	
	}
	
	 @Override
	 protected void onPause() {
	     super.onPause();
	     mGLView.onPause();
	 }

	 @Override
	 protected void onResume() {
	     super.onResume();
	     mGLView.onResume();
	 }
	 
	 private boolean detectOpenGLES20() 
	 {
	     ActivityManager am =
	            (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
	     ConfigurationInfo info = am.getDeviceConfigurationInfo();
	     return (info.reqGlEsVersion >= 0x20000);
	 }
	 
     static {
         System.loadLibrary("game");
     }
     
     
    //////////////////////////////////////////////////////////////////////////
    
    //	Handler 用来
    
    //////////////////////////////////////////////////////////////////////////   

    public static final int HANDLER_CHECKFEE_A = 1;
    public static final int HANDLER_CHECKFEE_B = 2;
    
    public static class PayHandler extends Handler{
    	WeakReference<FuckAndroid> mActivity;
    	
    	PayHandler(FuckAndroid activity){
    		mActivity = new WeakReference<FuckAndroid>(activity);
    	}
    	
    	@Override
    	public void handleMessage(Message msg){
    		FuckAndroid theActivity = mActivity.get();
    		switch(msg.what){
    		case HANDLER_CHECKFEE_A:
    			theActivity.checkFeeA();
    			break;
    		case HANDLER_CHECKFEE_B:
    			theActivity.checkFeeB();
    			break;
    		}
    	}
    };
     
    public static void sendCheckFeeAMessage(){
    	Message msg = new Message();
    	msg.what = HANDLER_CHECKFEE_A;
    	
    	handler.sendMessage(msg);
    } 
    
    public static void sendCheckFeeBMessage(){
    	Message msg = new Message();
    	msg.what = HANDLER_CHECKFEE_B;
    	
    	handler.sendMessage(msg);
    }
     
    //////////////////////////////////////////////////////////////////////////
    
    //	电信的计费API范例
    
    //////////////////////////////////////////////////////////////////////////   
    
    
 	//采用本Activity实现SMSListener接口,必须实现smsOK和smsFail接口
 	
 	private String reLifeFeeName = "reLife";
 	
     
     
 	/**
 	 * 使用本Activity直接实现SMSListener接口的方式
 	 */
 	void checkFeeA() {
 		String feeName = "mode_A";
 		
 		/*
 		 * 验证计费点核心静态方法,自动完成全部短代过程
 		 * @param feeName 计费点标识符,不可包含#号,不同计费点此值必须不同
 		 * @param activity Activity 不能为null
 		 * @param listener SMSListener接口,处理发送成功和失败的操作,不能为null
 		 * @param feeCode 短代代码,请登录平台查询产品计费信息并完整复制对应的计费点!!费用按平台上此计费点的对应费用计!
 		 * @param tip 短代提示语
 		 * @param okInfo 短代发送成功的提示语
 		 * @param isRepeat  是否可重复计费(true为软计费点,false为硬计费点)
 		 * @return 返回是否已计过费
 		 */
 		if (SMS.checkFee(feeName, this, this, "0111C001741102210071271102210070930115174000000000000000000000000000", "开启\"xxx-A\",点击确定将会发送一条1元短信,不含信息费.", "发送成功!已成功解锁!",false)) {
 			//在这里处理该计费点已扣过费后的处理
// 			Toast.makeText(this, "已计过费,直接进入关卡"+feeName, Toast.LENGTH_SHORT).show();
 			Cocos2dxActivity.showMessageBox("已计费", "已计过费,直接进入关卡"+feeName);
 		}
 	}
 	
 	void checkFeeB() {
 		String feeName = "mode_B";
 		/*
 		 * 验证计费点核心静态方法,自动完成全部短代过程
 		 * @param feeName 计费点标识符,不可包含#号,不同计费点此值必须不同
 		 * @param activity Activity 不能为null
 		 * @param listener SMSListener接口,处理发送成功和失败的操作,不能为null
 		 * @param feeCode 短代代码,请登录平台查询产品计费信息并完整复制对应的计费点!!费用按平台上此计费点的对应费用计!
 		 * @param tip 短代提示语
 		 * @param okInfo 短代发送成功的提示语
 		 * @param isRepeat  是否可重复计费(true为软计费点,false为硬计费点)
 		 * @return 返回是否已计过费
 		 */
 		if (SMS.checkFee(feeName, this, this, "0813C3400211022100862511022100811701MC099572000000000000000000000000", "开启\"xxx-B\",点击确定将会发送一条2元短信,不含信息费.", "发送成功!已成功解锁!",false)) {
 			//在这里处理该计费点已扣过费后的处理
// 			Toast.makeText(this, "已计过费,直接进入关卡"+feeName, Toast.LENGTH_SHORT).show();
 			Cocos2dxActivity.showMessageBox("已计费", "已计过费,直接进入关卡"+feeName);
 		}
 	}
 	
 	
 	/**
 	 * 在弹出计费提供框后,用户点击确定并计费成功后的处理
 	 * @param feeName 对应当计费标识值
 	 * @see cn.game189.sms.SMSListener#smsOK(java.lang.String)
 	 */
 	public void smsOK(String feeName) {
 		//关卡打开后续代码
 		Log.i("SMSListener", "模式"+feeName+"已计费完成,关卡已打开.");
 		if (feeName.equals("mode_A")) {
 			//打开mode_A计费点后的操作
// 			Toast.makeText(this, "关卡"+feeName+"开启后的操作", Toast.LENGTH_SHORT).show();
 			Cocos2dxActivity.showMessageBox("计费成功", "关卡"+feeName+"开启后的操作");
 		}else if(feeName.equals("mode_B")){
 			//打开mode_B计费点后的操作
// 			Toast.makeText(this, "第二个关卡"+feeName+"开启后的操作", Toast.LENGTH_SHORT).show();
 			Cocos2dxActivity.showMessageBox("计费成功", "第二个关卡"+feeName+"开启后的操作");
 		}else if(feeName.equals(this.reLifeFeeName)){
 			//原地复活
// 			Toast.makeText(this, "角色原地复活功能实现", Toast.LENGTH_SHORT).show();
 			Cocos2dxActivity.showMessageBox("计费成功", "角色原地复活功能实现");
 		}
 	}



 	/**
 	 * 短代发送失败,错误码含义如下:
 	 * <pre>
 	 * 0.初始值或取消发送
 	 * 1.已计过费
 	 * 2.发送短信成功
 	 * -1.发送失败
 	 * -2.无卡
 	 * -3.非电信卡
 	 * -4.获取终端码失败
 	 * -5.保存计费点失败
 	 * -6.获取存档数据有误
 	 * -7.获取存档时读终端码失败
 	 * -8.获取存档时feeName不匹配
 	 * -9.获取存档时终端码不匹配
 	 * -10.获取存档发生异常 
 	 * -11.feeName不合法
 	 * </pre>
 	 * @param feeName 对应当前的SMS.STR_CHECK值
 	 * @param errorCode 错误码
 	 * @see cn.game189.sms.SMSListener#smsFail(int)
 	 */
 	public void smsFail(String feeName,int errorCode) {
 		Log.e("SMSListener", "计费失败!计费点:"+feeName+" 错误码:"+errorCode);
 		//其他错误处理操作,不给道具或不放行关卡
 	}



 	public void smsCancel(String feeName, int errorCode) {
 		Log.e("SMSListener", "用户点击取消!计费点:"+feeName+" 错误码:"+errorCode);
 		
 	}
}

以上是我作的电信计费测试代码。如果通过Handler调用,而不是直接调用,就不会出现死机问题。


Cocos2d-x与Android利用JNI相互调用 Cocos与Android利用JNI相互调用 阅读详情

相关推荐

简析 cocos2d-x Android 调用启动过程

一、启动activtiy        AndroidManifest.xml里配置了启动activity为AppActivity       <activity android:name="org.cocos2dx.cpp.AppActivity" android:label="@string/app_name"

xueerpp的专栏 7381

Android cocos2dx游戏开发——示例程序HelloCpp源码分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34293059的博客 220

Cocos2d-x开发---关于安卓打包所遇到的错误记录

cocos2dx 安卓打包错误记录

Coding 2440

cocos2dx 3.17学习历程之项目创建(一)

以下和以后的学习日记和案列仅代表自己的观点和学习中的理解程度,有错误敬请理解,相互学习,相互成长,坚持写日记也是加深学习的印象,就怕眼高手低,我吃亏过来的,不要怕麻烦,前期的基础知识非常的重要!!!!! 学习一个新知识和接触一个新的游戏引擎,首先得了解它的历史和发展历程。 所谓磨刀不误砍柴工嘛! cocos2dx 游戏的发展历史:https://blog.csdn.net/gzylongxi...

maoye的博客 2万+

cocos2d-x 通过JNI实现c/c++和Android的java层函数互调-源码

cocos2d-x 通过JNI实现c/c++和Android的java层函数互调-源码 详情请移步到:http://codingnow.cn/program/992.html

二、Cocos2dx中Android部分的c++和java实现相互调用(高级篇)

本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=97 本文目的 要完成在cocos2dx的场景上一个点击事件,传递一个消息到java层,下面让我们看看如何完成它。 包括 你需要在你的项目中添加以下引用,原作者已经建立了一个在线项目。请确保在你的项目中包含文件了c++和Java,这里有个链接你可以查看一下:EasyNDK

qinning199的专栏 1万+

BMW Standard Tools 宝马FSC工具套装下载

这是一款非常专业的一套宝马编码工具,懂行的人自然知道他的用处,不懂行的人,我解释再多也不会明白的,需要的拿去吧。软件名:BMW Standard Tools包含工具:BMW Coding Tool v2.50、change Language、CIC Mafia、Dr.Gini B021、EasyConnect、EDIABAS Konfigurator v1.1、EDIABAS Konfigurator v2.0.0、FSC-Tools_2.18、FSTool_v2_CarServer、INPA、ITool

Zj_arrow的博客 6995

Cocos Creator接入谷歌广告AdMob详细教程(原创)

为什么要接谷歌广告?简述几个点:游戏版号暂停、轻游戏回暖、游戏出海、google play、广告收益。 网上关于cocos creator接入AdMob的教程,多是不能用,或已经过时,或不详细,容易给初学者带来勿扰。 所以特写此文,给大家分享一下完整的Android游戏应用如何接入AdMob,以及过程中踩到的坑。 参考文档 Google AdMob官方文档:https://developers...

oyh6857451的博客 1万+

不止于使能:用汇川PLC功能块封装,实现伺服轴状态管理与安全逻辑

本文深入探讨了汇川PLC功能块封装在伺服轴控中的应用,详细介绍了如何通过高级封装技术实现伺服轴的状态管理与安全逻辑。文章涵盖了从基础使能到全生命周期监控的进化,多轴协同的实例化管理策略,以及安全逻辑的防御性编程技巧,为工业自动化领域的工程师提供了实用的解决方案和最佳实践。

weixin_28684825的博客 271

【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛。 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口,然后还需要3个IO片选数码管接口,这样大大占用了IO口,导致连接的外设变少。因此我们引入74LS595芯片。电路设计如下: 只需要三个共阴极数码管与三个595芯片级联即可完成,通过RCLK,SCK,SER三个IO即可完成对数码管的动态控制并显示。电路焊接的实物图如下: 要求完成功能:实现数.

XiaoCaiDaYong的博客 8263

Android通过JNI调用cocos2d-x中的C++方法

假如我们遇到这样一种情况:通过cocos2d-x在Android平台实现一个录音功能或者播放视频功能,当录音结束或者视频播放结束时,Android该如何通知Cocos2d-x呢?

寻一份宁静 1058

【理解机器学习算法】之Clustering算法(Agglomerative Clustering)

是一种层次聚类算法,通过逐步合并或“聚集”它们来构建嵌套聚类。这种方法采用自底向上的方式构建聚类层次:它从将每个数据点作为单个聚类开始,然后迭代合并最接近的聚类对,直到所有数据点合并为一个聚类,或直到达到指定的聚类数量。优点:- 聚合聚类在距离和连接准则的选择上具有多样性,使其适用于各种数据集。- 它产生了一个层次结构,这对于不同规模的聚类数据结构是有信息量的。-缺点:- 对于大数据集来说,它可能计算成本高,因为它需要在每次迭代中计算和更新所有聚类对之间的距离。

Hyman Qiu 2688

Cocos2d-x调用Java最终实例代码

HelloWorldScene.cpp #include "HelloWorldScene.h" #include "SimpleAudioEngine.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include #include "platform/android/jni/JniHelper.h" #include #endif

StupidCodeGenerator的专栏 6792

AutoLISP 学习 (一)

AutoLISP基本语法结构、语法 以括号组成表达式,左右括号一定要成对,单、双引号也要成对,例如: (defun c:hello() (princ "\nHello world!") (prin1) ) 表达式格式:(函数名 操作数 操作数 …),例如: (setq p1 (list 0 0)) (setq p2 (list 10 10)) (setq p3 (list 20 20)) ;;; CAD中画直线,经过p1 p2 p3 (command "LINE" p1 p2 p3 ""

m0_54575622的博客 2122

华硕天选3 win11+ubuntu20.04双硬盘双系统配置(包括ubuntu重启后无法成功进入、没有wifi图标的设置)

1、制作系统盘 2、分区 3、重启电脑按F2

baidu_38431960的博客 1万+

cocos2d-x通过eclipse搭建安卓开发环境

概述cocos2d是一个基于MIT协议的开源框架,用于构建游戏,应用程序和其他图形界面的交互应用。 作为一个游戏引擎, 它可以帮你在创建游戏时节省很多的时间和精力,是目前非常流行的游戏引擎之一。在2D游戏方面,可以说是绝对的王者,市场占有率非常高。

jialiang的博客 2057

YOLOv11 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

本文介绍了分离与增强注意力模块(SEAM)在YOLOv11中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道重要性,通过1x1卷积增强通道联系,利用两层全连接网络融合通道信息,经指数归一化后作为注意力权重与原始特征相乘。我们将SEAM集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,该方法有助于提升模型检测性能。

魔改工程师的博客 1664

Cocos2d-x 配置Android & cocos2d-x 开发环境

一、在Win7环境下VS2010中安装cocos2d-x-2.1.4 1、下载cocos2d-x-2.1.4 从Cocos2d-x官网下载最新版本2.1.4,发布日期为2013-6-18,官方网址为:http://cocos2d-x.org/ 如上图右侧所示,点击2.1.4(2013-06-18)即可下载最新稳定发布版cocos2d-x-2.1.4。 下载后的coc

Edward_Wong的专栏 2396

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

关于cocos2d-x 和安卓之间的相互调用

最近在研究cocos2d游戏移植安卓需要调用很多方法,所以在研究之中写下它们之间相互调用 首先,cocos2d调用安卓 在一个.h文件中添加头文件 #include #include "platform\android\jni\JniHelper.h" JniMethodInfo minfo;//定义Jni函数信息结构体 //getStaticMethodIn

霸气十足的me 2918

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

cocos2d-x 4.0 学习之路(十八)将工程部署到安卓手机

在电脑端我们学习了这么多,但游戏不在手机上玩怎么可以呢。那我们今天就把之前做的忍者来袭小游戏,移植到安卓手机端,看看效果吧。 cocos2d-x作为跨平台的框架,当然移植起来也会很容易的。 想在安卓手机上跑,要在你的电脑端安装AndroidSDK和NDK,并且配置好环境变量。 1.安装Android SDK 为了安卓开发的方便还是建议直接安装Android Studio,点击下载,这里会自动为你安装Android SDK的。安装步骤也比较简单,不详述了。启动之后会出现下面的提示,选择“Do not impo

2888

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Cocos2d-x利用jni调用java层代码

jni的意思是java本地调用,通过jni可以实现java层代码和其他语言写得代码进行交互。在Cocos2d-x中,如果想要在C++层调用java层的代码,就是通过jni技术。通过调用java层的代码,我们就可以在Android平台下实现一些引擎没有提供给我们的功能,或者做一些其他的功能。比如加个广告,加个分享,调用Android原生的对话框等等吧。Cocos2d-x比较人性化的是为我们封装了jn

Flight_Forever的博客 521

【android-cocos2d-X2.2 环境配置】在Mac下搭建Cocos2d-X-android开发环境!

【android-cocos2d-X 环境配置】在Mac下搭建Cocos2d-X-android开发环境! (1)下载 (2)配置环境变量 (3)创建cocos2x项目 (4)编译cocos2x项目 (5)运行cocos2x项目

人生如游戏,不如做游戏, 1万+

C++ 调用 Java Cocos2d-x利用jni调用java层代码

JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)所以我们需要引用JNI头文件。(引入前做一下平台判断) #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include #include "platform/android/jni/JniHelper.h"

zhanghow的博客 603
上一篇: Dialog not displaying when calling from JNI
下一篇: Linux下打开在Windows下创建的项目出现中文乱码
垃圾桶
博客等级 码龄15年 20粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值