转载请注明地址,谢谢。。

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

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

我们有一个Android工程 :CocosDemoAndroid

还有一个Win32工程:Cocos2dDemo.win32

这个是必备的。。。

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

void CallJni::getInputCallBack(CCObject* pSender)
{
g_AndroidPlatform.showDialog(); }

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

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的时候不要忘记加上头文件

#ifdef ANDROID
#include<jni.h>
#include"platform/android/jni/JniHelper.h"
#endif

下面来看Android层代码了。

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

工程包名 : com.example.cocosdemoandroid

Activity:MainActivity

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文件:

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)

最后上效果图:

Cocos2d-x C++调用Android弹出提示框的更多相关文章

  1. SilverLight 页面后台方法XX.xaml.cs 创建JS,调用JS ,弹出提示框

    1.Invoke和InvokeSelf [c-sharp] view plaincopy public partial class CreateJSDemo : UserControl { publi ...

  2. android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果

    需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果,  总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...

  3. android标题栏下面弹出提示框(一) TextView实现,带动画效果

    产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...

  4. iOS bug 之 H5 页面没有弹出提示框

    描述:在安卓上有提示框,但是在iOS上没有提示框. step 1: 失误,是我没有在正确的位置设置网址. step 2: 修改之后,测试页能弹出提示框,但是正式的页面没有提示框. step 3: 我输 ...

  5. C#自动关闭弹出提示框

    自动关闭弹出提示框(用一个小窗体显示提示信息):例如在一个form窗体中弹出自动关闭的提示框1.首先创建一个弹出提示信息的窗体 AutoCloseMassageBox,在里面拖一个lable控件,去掉 ...

  6. odoo13之右上角弹出提示框

    前言 在odoo中已经提供好了右上角弹出提示框的接口,我们只需要调用即可: 而提示框的实现又分为前端js实现和后段函数实现,前后端实现的效果相同. 实现效果图 前端实现提示框 在前端中显示提示框最常用 ...

  7. PHP弹出提示框并跳转到新页面即重定向到新页面

    本文为大家介绍下使用PHP弹出提示框并跳转到新页面,也就是大家所认为的重定向,下面的示例大家可以参考下   这两天写一个demo,需要用到提示并跳转,主要页面要求不高,觉得没必要使用AJAX,JS等, ...

  8. Android弹出选项框及指示箭头动画选择

     Android弹出选项框及指示箭头动画选择 Android原生的Spinner提供了下拉列表选项框,但在一些流行的APP中,原生的Spinner似乎不太受待见,而通常会有下图所示的下拉列表选项框 ...

  9. [转] 在Asp.net前台和后台弹出提示框

    一.在前台弹出提示框 1.点击"A"标记或者"控件按钮"弹出提示框 <asp:LinkButton ID="lbtnDel" runa ...

随机推荐

  1. iOS7 NavigationController 右滑手势问题

    苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecogni ...

  2. ios不同版本下的UILabel自动换行问题

    @interface ThreadPreviewCell : UITableViewCell @property (nonatomic, strong) UILabel *titleLabel; @e ...

  3. JS中小数的差,比较大小

    var a = 0.3-0.2; -0.3; alert(a + "&" + b); if (a == b) { alert("true"); } el ...

  4. php-Eclipse对php中的namespace关键字报语法错误的问题

    namespace是php5.3以上才支持的, 解决办法:升级IDE 切换Eclipse中的php版本 Window  > Preferences  > PHP  > PHP Int ...

  5. 富文本编辑器ckeditor继承

    新建一个web项目ckfinder,导入lib包 加入java包,编码格式UTF-8 在WebRoot下添加ckedtior以及ckfinder两个文件夹,将config.xml拷入WEB-INF中 ...

  6. 将 SQL Server 实例设置为自动启动(SQL Server 配置管理器)

    本主题说明如何使用 SQL Server 配置管理器在 SQL Server 2012 中将 SQL Server 实例设置为自动启动. 在安装过程中,SQL Server 通常配置为自动启动. 如果 ...

  7. Azure SQL 数据库引入了新的服务级别

     新的级别将提升客户体验,并提供更多的业务连续性选项 为了更好地满足您在灵活性提升方面的需求,MicrosoftAzure SQL 数据库添加了新的服务级别(基础级和标准级),以与当前处于预览状态 ...

  8. VC实现卡拉OK字幕叠加

    一. GDI编程基础 字幕叠加,应当是属于图形.图像处理的范畴.在Windows平台上,图形.图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口).GDI是 ...

  9. CF R303 div2 C. Woodcutters

    C. Woodcutters time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  10. The Highest Mark(01背包)

    The Highest Mark Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...