- 浏览: 928827 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
itzhongyuan:
java Random类详解 -
david_je:
你好,我看到你在C里面回调JAVA里面的方法是在native里 ...
Android NDK开发(1)----- Java与C互相调用实例详解 -
fykyx521:
请求锁是在 oncreate 释放实在ondestroy?? ...
Android如何保持程序一直运行 -
aduo_vip:
不错,总结得好!
Android读取assets目录下的资源 -
f839903061:
给的网址很给力哦!
Android 4.0.1 源码下载,编译和运行
1.
先把cocos2dx根目录中的
/Users/zhaoshun/cocos2dx/cocos2d-2.0-x-2.0.4/cocos2dx/platform/android 目录
拷贝到 xcode项目的
工程根目录/libs/cocos2dx/platform 目录下
2.
在xcode工程中
文件开头加入 预编译
。。。。。。代码
3.
在cocos2dx方法中 调用java方法
比如
函数的签名可以使用如下命令获取
4. JniHelper.h文件 讲解
此文件在 cocos2dx跟目录/cocos2dx/cocos2dx/platform/android/jni/JniHelper.h
内容
先把cocos2dx根目录中的
/Users/zhaoshun/cocos2dx/cocos2d-2.0-x-2.0.4/cocos2dx/platform/android 目录
拷贝到 xcode项目的
工程根目录/libs/cocos2dx/platform 目录下
2.
在xcode工程中
文件开头加入 预编译
//使用预编译,对当前平台为Android时才会导入如下头文件 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include <jni.h> #include "platform/android/jni/JniHelper.h" #include <android/log.h>
。。。。。。代码
#endif
3.
在cocos2dx方法中 调用java方法
比如
void HelloWorld::menuCloseCallback(CCObject* pSender) { ////静态函数示例1.无参数,无返回值 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 JniMethodInfo minfo;//定义Jni函数信息结构体 //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数 bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/example/testGame/testGame","testFun", "()V"); if (!isHave) { CCLog("jni:此函数不存在"); }else{ CCLog("jni:此函数存在"); //调用此函数 minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID); } CCLog("jni-java函数执行完毕"); #endif }
函数的签名可以使用如下命令获取
javap -s 包名 类名 可以显示函数的签名 到bin的classes目录
4. JniHelper.h文件 讲解
此文件在 cocos2dx跟目录/cocos2dx/cocos2dx/platform/android/jni/JniHelper.h
内容
#ifndef __ANDROID_JNI_HELPER_H__ #define __ANDROID_JNI_HELPER_H__ #include <jni.h> #include <string> #include "platform/CCPlatformMacros.h" NS_CC_BEGIN typedef struct JniMethodInfo_ { JNIEnv * env; jclass classID; jmethodID methodID; } JniMethodInfo; class CC_DLL JniHelper { public: static JavaVM* getJavaVM(); static void setJavaVM(JavaVM *javaVM); static const char* getExternalAssetPath(); static void setExternalAssetPath(const char* externalAssetPath); static jclass getClassID(const char *className, JNIEnv *env=0); static bool getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode); static bool getMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode); static std::string jstring2string(jstring str); private: static JavaVM *m_psJavaVM; static std::string m_externalAssetPath; }; NS_CC_END #endif // __ANDROID_JNI_HELPER_H__
// 静态函数示例1.无参数,无返回值 public static void testFun() { Log.e("Himi", "静态函数示例1.无参数,无返回值"); } // 静态函数示例2.有参数,无返回值 public static void testFunWithInt(int _int) { Log.e("Himi", "静态函数示例1.有参数,无返回值;传入的参数int=" + _int); } // 静态函数示例3.有参数,有返回值 public static int testFunWithIntAndRtn(int _int) { Log.e("Himi", "静态函数示例1.有参数,有返回值;传入的参数int=" + _int); return _int+1000; } // 静态函数示例4.有参数,有返回值(String类型) public static String testFunWithStringAndRtn(int _int) { Log.e("Himi", "静态函数示例4.有参数,有返回值(String类型);int=" + _int); return "yes,return 'String' is OK --by Himi"; } //---- 函数示例之非静态函数调用 //(先获取个对象) public static Activity actInstance;//定义单例 public static Object rtnActivity() { return actInstance; } //使用此对象进行调用非静态函数 public void nostaticFun() { Log.e("Himi", "no static Function is OK - By Himi"); }
////静态函数示例1.无参数,无返回值 //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 // JniMethodInfo minfo;//定义Jni函数信息结构体 // //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数 // bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/example/testGame/testGame","testFun", "()V"); // // if (!isHave) { // CCLog("jni:此函数不存在"); // }else{ // CCLog("jni:此函数存在"); // //调用此函数 // minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID); // } // CCLog("jni-java函数执行完毕"); //#endif ////静态函数示例2.有参数,无返回值 //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 // JniMethodInfo minfo;//定义Jni函数信息结构体 // //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数 // bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/example/testGame/testGame","testFunWithInt", "(I)V"); // // if (!isHave) { // CCLog("jni:此函数不存在"); // }else{ // CCLog("jni:此函数存在"); // //调用此函数 第三个参数为 传入的值 // minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,888); // } // CCLog("jni-java函数执行完毕"); //#endif // //静态函数示例3.有参数,有返回值--------------------------------$$$$$$$-------------------------------- //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 // JniMethodInfo minfo;//定义Jni函数信息结构体 // //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数 // // bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/example/testGame/testGame","testFunWithIntAndRtn","(I)I"); // jint _int; // if (!isHave) { // CCLog("jni:此函数不存在"); // }else{ // CCLog("jni:此函数存在"); // //调用此函数 // _int = minfo.env->CallStaticIntMethod(minfo.classID, minfo.methodID,823); // // //尝试jint是否能正常接收返回的int值 // JniMethodInfo minfo_ty; // bool isHave = JniHelper::getStaticMethodInfo(minfo_ty, "com/example/testGame/testGame", "testFunWithInt", "(I)V"); // if (isHave) { // minfo_ty.env->CallStaticVoidMethod(minfo_ty.classID, minfo_ty.methodID,_int); // } // // } // CCLog("jni-java函数执行完毕"); //#endif //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 // JniMethodInfo minfo;//定义Jni函数信息结构体 // //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数 // bool isHave = JniHelper::getStaticMethodInfo(minfo, "com/example/testGame/testGame","testFunWithStringAndRtn","(I)Ljava/lang/String;"); // jobject jobj; // if (!isHave) { // CCLog("jni:此函数不存在"); // }else{ // CCLog("jni:此函数存在"); // //调用此函数 // jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID,823); // } // CCLog("jni-java函数执行完毕"); //#endif //#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台 // JniMethodInfo minfo;//定义Jni函数信息结构体 // //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数 // bool isHave = JniHelper::getStaticMethodInfo(minfo, // "com/example/testGame/testGame", //类的路径 // "rtnActivity", //方法名 // "()Ljava/lang/Object;"); //括号里的是参数,后面的是返回值。 // jobject jobj; // if (isHave) { // jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID); // } // CCLog("正确获取到 jobj"); // // // // isHave = JniHelper::getMethodInfo(minfo, // "com/example/testGame/testGame", //类的路径 // "nostaticFun", //方法名 // "()V"); //括号里的是参数,后面的是返回值。 // // if (isHave) { // minfo.env->CallVoidMethod(jobj, minfo.methodID); // } // CCLog("jni-java函数执行完毕"); //#endif
发表评论
-
Android使用binder访问service的方式
2013-08-23 09:42 16301. 我们先来看一个与本地service通信的例子。 pub ... -
android-Service和Thread的区别
2013-08-23 09:17 913servie是系统的组件,它由系统进程托管(servicema ... -
git介绍
2013-08-01 14:49 1031git介绍 使用Git的第一件事就是设置你的名字和email ... -
cocos2d-x学习之自动内存管理和常见宏
2013-07-29 15:41 9081.自动内存管理 1)概述 C++语言默认是 ... -
cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解
2013-07-29 10:35 1108第一个改动: CCLayer初始化 自定义Layer,类名 ... -
xcode与eclipse整合cocos2dx
2013-07-29 10:32 1219文档xcode版本是 204 1. 在xcode中创建coc ... -
git提交代码
2013-07-23 16:00 10501. 在本地创建一个Git的工作空间,在里面创建一个工程(如H ... -
Java中HashMap遍历的两种方式
2013-07-23 13:58 994转]Java中HashMap遍历的两种方式 原文地址: htt ... -
Android.mk的用法和基础
2013-07-19 14:11 4330一个Android.mk file用来向编译系统描述你的源代码 ... -
eclipse配置NDK-Builder命令
2013-07-18 11:02 10341. 2. -
eclipse配置javah命令
2013-07-18 10:48 19931.找到javah命令所在的目录 我的为 /usr/bi ... -
Android SDL2.0 编译
2013-07-17 13:40 19651,下载: wget http://www.libsdl.o ... -
GCC 编译使用动态链接库和静态链接库
2013-07-16 21:28 14541 库的分类 根据链接时期的不同,库又有静态库和动态库之分。 ... -
在mac下编写ffmpeg项目
2013-07-15 21:32 9861.建立工程TestFFmpeg 2.编写c文件 mian. ... -
使用低版本gcc/g++
2013-06-08 14:22 1238解决方法为有两个 第一个方法: 上下载对应版本的.deb文件 ... -
IntelliJ Idea 常用快捷键列表
2013-05-27 10:19 0Alt+回车 导入包,自动修 ... -
android应用后台安装
2013-05-21 12:02 1012android应用后台安装,静默安装的代码实现方法 http ... -
编译linux内核映像
2013-05-21 11:33 960a)准备交叉编译工具链 android代码树中有一个pr ... -
如何单独编译Android源代码中的模块
2013-05-21 11:29 992一. 首先在Android源代码 ... -
Ubuntu安装JDK6和JDK5
2013-05-19 19:04 1006sudo apt-get install sun-java6- ...
相关推荐
在项目中整合Lua脚本,通常会在Cocos2d-x的启动文件中(如`main.cpp`)调用Lua的初始化函数,然后加载并运行主lua脚本。例如,你可以使用`cocos2d::CCApplication::sharedApplication().run()`来启动Cocos2d-x引擎,...
为了在Cocos2d-iOS项目中播放视频,我们需要利用苹果的MedialPlayer框架,这个框架包含了播放多媒体文件的功能。以下是实现Cocos2d-iOS播放视频的具体步骤: 1. **环境准备**:确保你的开发环境是兼容的,例如,...
在Cocos2d-x + Lua开发游戏的过程中,有时需要接入iOS原生SDK,例如应用内购买、广告SDK或社交平台SDK等。这篇文章主要探讨如何在Cocos2d-x结合Lua的环境中实现与iOS原生SDK的对接。首先,我们要明确这里的iOS原生...
- 要在Cocos2d-x和原生代码之间传递消息,可以使用Cocos2d-x的`lua_module_register`函数注册回调,然后在lua中通过`cccall`调用这些回调。 7. **调试与优化**: - 对于lua脚本的调试,可以利用Cocos2d-x的lua...
在某些版本的cocos2d-x中,可能由于兼容性问题或编译设置不正确,导致在较新的iOS设备上运行时出现lua_open()函数调用失败,从而造成程序崩溃。 问题的关键在于lua_open()函数,它是启动Lua环境的核心函数,负责...
Cocos2D是一款广泛使用的开源游戏开发框架,尤其在2D游戏、教育软件以及互动媒体应用的开发中占据重要地位。...在Xcode中随时查阅,能帮助我们在编写Cocos2D项目时避免不必要的错误,更好地实现游戏设计和功能。
本文将深入解析Cocos2d 3.4版本中创建HelloWorld工程的实例代码,并提供相关的文档说明。 一、环境搭建 在开始Cocos2d 3.4的开发之前,首先需要安装必要的开发工具。这通常包括: 1. Cocos2d-x SDK:这是Cocos2d的...
在实际的摇杆实现中,开发者可能会用到Cocos2D的触摸事件处理函数,如`ccTouchBegan:withEvent:`、`ccTouchMoved:withEvent:`和`ccTouchEnded:withEvent:`,分别对应于触摸开始、触摸移动和触摸结束。这些函数会在...
然后将豌豆荚SDK的库文件导入到你的cocos2d-x项目中,并根据平台(Android或iOS)进行相应的配置,如在AndroidManifest.xml或Info.plist中添加必要的权限和设置。 2. **初始化支付服务**:在游戏启动时,初始化豌豆...
在cocos2d-x中,我们可以利用其图形渲染能力,结合自定义的逻辑代码,实现A*算法的可视化。 A*算法的核心在于找到从起点到终点的最短路径,同时考虑了代价和估计代价。它结合了Dijkstra算法的全局最优性与Greedy...
这通常涉及cocos2d-x提供的Lua绑定机制,通过这种方式,Lua脚本能够调用C++编写的函数和访问C++对象。 随着项目的进行,开发者可能还需要对Lua脚本进行编译和加密,以防止游戏逻辑被轻易反编译。此外,发布游戏时,...
本篇文章将深入探讨如何在Cocos2d-x框架中集成并使用Box2D物理引擎,特别是在Xcode环境下。 首先,让我们了解什么是Cocos2d-x。Cocos2d-x是一个开源的2D游戏开发框架,它支持多种编程语言,包括C++、Lua和...
Cocos2d-x 社区提供了许多第三方插件,如广告、支付、社交分享等,这些插件通常有 Lua API,可以直接在 Lua 脚本中调用。了解如何安装和使用这些插件,能极大地丰富游戏功能。 六、性能优化 在 Lua 中,合理使用...
Cocos2d-js是Cocos2d-x的一个分支,它允许开发者使用JavaScript进行游戏逻辑编程,同时可以利用C++来优化性能关键的部分。`2.jsb_c++调用js中的方法`这个主题就是关于如何在C++中通过JSB(JavaScript Bindings)来...
filter>同时,别忘了在 Android 工程的 strings.xml 文件中添加微信 AppId:<string name="wechat_app_id">wx03b40674b0565a42</string>5、iOS 特殊配置对于 iOS 平台,需要在 Xcode 的项目设置中配置 URL Schemes。...
在Java标签的指引下,我们可以推测这个项目可能是将Cocos2d-x与Java技术结合使用,这可能是因为开发者想要利用Java的特性或者工具链来增强游戏的后端服务、服务器端逻辑或者构建Android版本时的开发流程。Java虽然...
通常,这涉及到将源码库中的cocos2d-x目录替换到Cocos Creator的项目根目录下的cpp或js文件夹,具体取决于你的项目类型。确保在执行此操作之前备份原有的引擎源码,以免丢失任何个性化修改。 接下来,进行集成配置...
2. **main.m**:应用的入口点,通常会调用Cocos2d-x的初始化函数。 3. **Resources**:资源目录,存放游戏的图像、音频、XML配置文件等静态资源。 4. **Classes**:源代码目录,包含游戏逻辑、场景、角色等类的实现...