Cocos2d-x中提供了一个JniHelper类来让我们对Jni进行操作。
来源:互联网 发布:淘宝女鞋文案 编辑:程序博客网 时间:2024/06/06 14:18
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:=libRakNetLOCAL_SRC_FILES:=$(RAKNET_LIB_PATH)include $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := CocosDemo_sharedLOCAL_CFLAGS:=-w -DANDROID -DRAPIDXML_NO_EXCEPTIONSLOCAL_MODULE_FILENAME := libCocosDemoLOCAL_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:= libRakNetLOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_staticinclude $(BUILD_SHARED_LIBRARY)$(call import-module,CocosDenshion/android) \$(call import-module,cocos2dx) \$(call import-module,extensions)
最后上效果图:
来自:http://www.tuicool.com/articles/jq2If2
0 0
- Cocos2d-x中提供了一个JniHelper类来让我们对Jni进行操作。
- Cocos2d-x对JNI操作的封装:JniHelper类详解
- Cocos2d-x中通过JNI进行C++调用Java代码 JniHelper类的使用
- cocos2d-x中有一个JniHelper类详细使用
- cocos2d-x中有一个JniHelper类详细使用 .
- cocos2d-x中有一个JniHelper类详细使用
- cocos2d-x中有一个JniHelper类详细使用
- cocos2d-x中有一个JniHelper类详细使用
- cocos2d-x中有一个JniHelper类详细使用
- cocos2d-x中有一个JniHelper类详细使用
- cocos2d-x中有一个JniHelper类详细使用
- cocos2d-x中有一个JniHelper类详细使用
- cocos2d-x 中JniHelper类的使用
- cocos2d-x中JniHelper类详细使用
- Cocos2d-x中JniHelper详解
- cocos2d-x 对一个普通方法进行延时执行操作
- cocos2d-x Jnihelper类的使用
- Cocos2d-x之JniHelper
- java中使用SAX生成XML文件
- C++之一个程序学懂链表
- 第四周项目3——单链表应用(1)
- JAVA进阶4.4——食品库存管理
- 存储班长信息的学生类
- Cocos2d-x中提供了一个JniHelper类来让我们对Jni进行操作。
- Android 导航条效果实现(三) ViewPager+PagerTabStrip
- VC++编程过程中的一点杂记
- 前端学习------优先级和覆盖
- 警察和厨师-(1)
- java throws和throw的区别
- 排序算法之四--堆排序
- 第48课: Spark 2.0内幕深度解密和学习最佳实践
- 10款开源安卓游戏引擎