`
abc20899
  • 浏览: 928827 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cocos2dx中利用xcode 调用java中的函数

 
阅读更多
1.
先把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

分享到:
评论

相关推荐

    cocos2d-lua整合到ios工程.zip

    在项目中整合Lua脚本,通常会在Cocos2d-x的启动文件中(如`main.cpp`)调用Lua的初始化函数,然后加载并运行主lua脚本。例如,你可以使用`cocos2d::CCApplication::sharedApplication().run()`来启动Cocos2d-x引擎,...

    cocos2d播放视频方法相关

    为了在Cocos2d-iOS项目中播放视频,我们需要利用苹果的MedialPlayer框架,这个框架包含了播放多媒体文件的功能。以下是实现Cocos2d-iOS播放视频的具体步骤: 1. **环境准备**:确保你的开发环境是兼容的,例如,...

    Cocos2d-x + Lua接入iOS原生SDK的实现方案 - Cocos2d-x 开发笔记 - Cocos2d-x系列教程

    在Cocos2d-x + Lua开发游戏的过程中,有时需要接入iOS原生SDK,例如应用内购买、广告SDK或社交平台SDK等。这篇文章主要探讨如何在Cocos2d-x结合Lua的环境中实现与iOS原生SDK的对接。首先,我们要明确这里的iOS原生...

    cocos2d-lua整合到ios工程

    - 要在Cocos2d-x和原生代码之间传递消息,可以使用Cocos2d-x的`lua_module_register`函数注册回调,然后在lua中通过`cccall`调用这些回调。 7. **调试与优化**: - 对于lua脚本的调试,可以利用Cocos2d-x的lua...

    cocos2d-x-3rd-party-libs-bin.zip支持的libluajit.a文件

    在某些版本的cocos2d-x中,可能由于兼容性问题或编译设置不正确,导致在较新的iOS设备上运行时出现lua_open()函数调用失败,从而造成程序崩溃。 问题的关键在于lua_open()函数,它是启动Lua环境的核心函数,负责...

    cocos2d离线文档 docset格式的

    Cocos2D是一款广泛使用的开源游戏开发框架,尤其在2D游戏、教育软件以及互动媒体应用的开发中占据重要地位。...在Xcode中随时查阅,能帮助我们在编写Cocos2D项目时避免不必要的错误,更好地实现游戏设计和功能。

    cocos2d 3.4新建helloworld工程的例子代码及文档说明

    本文将深入解析Cocos2d 3.4版本中创建HelloWorld工程的实例代码,并提供相关的文档说明。 一、环境搭建 在开始Cocos2d 3.4的开发之前,首先需要安装必要的开发工具。这通常包括: 1. Cocos2d-x SDK:这是Cocos2d的...

    cocos2d 摇杆程序代码

    在实际的摇杆实现中,开发者可能会用到Cocos2D的触摸事件处理函数,如`ccTouchBegan:withEvent:`、`ccTouchMoved:withEvent:`和`ccTouchEnded:withEvent:`,分别对应于触摸开始、触摸移动和触摸结束。这些函数会在...

    cocos2d-x实现游戏支付功能

    然后将豌豆荚SDK的库文件导入到你的cocos2d-x项目中,并根据平台(Android或iOS)进行相应的配置,如在AndroidManifest.xml或Info.plist中添加必要的权限和设置。 2. **初始化支付服务**:在游戏启动时,初始化豌豆...

    A-Path-master.zip_cocos2d-x a*_timer

    在cocos2d-x中,我们可以利用其图形渲染能力,结合自定义的逻辑代码,实现A*算法的可视化。 A*算法的核心在于找到从起点到终点的最短路径,同时考虑了代价和估计代价。它结合了Dijkstra算法的全局最优性与Greedy...

    使用 cocos2d-x 和 Lua 快速开发游戏

    这通常涉及cocos2d-x提供的Lua绑定机制,通过这种方式,Lua脚本能够调用C++编写的函数和访问C++对象。 随着项目的进行,开发者可能还需要对Lua脚本进行编译和加密,以防止游戏逻辑被轻易反编译。此外,发布游戏时,...

    物理引擎的使用

    本篇文章将深入探讨如何在Cocos2d-x框架中集成并使用Box2D物理引擎,特别是在Xcode环境下。 首先,让我们了解什么是Cocos2d-x。Cocos2d-x是一个开源的2D游戏开发框架,它支持多种编程语言,包括C++、Lua和...

    cocos2dx-lua 笔记

    Cocos2d-x 社区提供了许多第三方插件,如广告、支付、社交分享等,这些插件通常有 Lua API,可以直接在 Lua 脚本中调用。了解如何安装和使用这些插件,能极大地丰富游戏功能。 六、性能优化 在 Lua 中,合理使用...

    2.jsb_c++调用js中的方法

    Cocos2d-js是Cocos2d-x的一个分支,它允许开发者使用JavaScript进行游戏逻辑编程,同时可以利用C++来优化性能关键的部分。`2.jsb_c++调用js中的方法`这个主题就是关于如何在C++中通过JSB(JavaScript Bindings)来...

    cocos2d-x集成sharesdk做ios和Android微信分享-白白

    filter&gt;同时,别忘了在 Android 工程的 strings.xml 文件中添加微信 AppId:&lt;string name="wechat_app_id"&gt;wx03b40674b0565a42&lt;/string&gt;5、iOS 特殊配置对于 iOS 平台,需要在 Xcode 的项目设置中配置 URL Schemes。...

    freak-flick:cocos2d-x

    在Java标签的指引下,我们可以推测这个项目可能是将Cocos2d-x与Java技术结合使用,这可能是因为开发者想要利用Java的特性或者工具链来增强游戏的后端服务、服务器端逻辑或者构建Android版本时的开发流程。Java虽然...

    Mob 录像 ShareREC Cocos Creator

    通常,这涉及到将源码库中的cocos2d-x目录替换到Cocos Creator的项目根目录下的cpp或js文件夹,具体取决于你的项目类型。确保在执行此操作之前备份原有的引擎源码,以免丢失任何个性化修改。 接下来,进行集成配置...

    IOS应用源码之【游戏】BouncingCocos_源码_游戏.zip

    2. **main.m**:应用的入口点,通常会调用Cocos2d-x的初始化函数。 3. **Resources**:资源目录,存放游戏的图像、音频、XML配置文件等静态资源。 4. **Classes**:源代码目录,包含游戏逻辑、场景、角色等类的实现...

Global site tag (gtag.js) - Google Analytics