【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译

本站文章均为
http://www.himigame.com/about-himi原创,转载务必在明显处注明:
转载自
http://www.himigame.com/ 原文链接: http://www.himigame.com/android-game/725.html

http://list.qq.com/cgi-bin/qf_invite?id=acfc24e272cc4a26debf3b3866edb626a9ea3fc80fd8893c 本博客最新动态!及时将最新博文通知您!很多看过之前Himi的http://www.himigame.com/android-game/667.html 博文的童鞋都在问我如何在Xcode中能调用Java的函数,比如在Android端需要加入广告、支付、等第三方平台或者单独处理的一些代码;那么本篇Himi分享如何在Cocos2dx中访问调用Android的Java层函数;首先Himi大概的介绍一个类 JniHelper ;此类主要用于Jni与Java层之间的相互访问的作用,那么此类的常用的一些函数这里首先介绍下,否则直接上代码不太容易吸收 ;JniHelper 类常用函数: 1. getStaticMethodInfo (四个参数,bool 返回值)使用示例代码:
1
bool isHave = JniHelper::getStaticMethodInfo(minfo,“com/ai/ommr/OhMonsterMR4Android”,“testFun”, “()V”);

此函数主要用于获取Java定义的类静态函数是否存在,返回bool;此函数有3个参数:第一参数: minfo ->JniMethodInfo 类型,后面详细说;第二个参数:类的路径。第三个参数:方法名(第一参数类中的函数)第四个参数:(参数)返回类型关于第一个和第二个参数都比较容易理解,那么第三个参数需要重点介绍一下;例如你在Java中定义一个如下函数 public void helloJni(){};那么getStaticMethodInfo函数第三个参数你应该传入 “()V” 表示此函数无参无返回值!如果有这么一个函数: public int helloJni(int _int){return 823};那么getStaticMethodInfo函数第三个参数你应该传入 “(I)I” 表示此函数需要传入一个int类型的参数并且返回一个int类型!大概说两个童鞋们应该基本理解了,那么下面详细写一些对照表,留给大家对照;
参数、返回值样式对照表:http://www.himigame.com/wp-content/uploads/2012/04/NVMAUDTZXE6TWIDJN08O11.jpg

这里的签名指的就是getStaticMethodInfo函数第三个参数中传入的样式; 2. getMethodInfo 类似与第一个函数,只是对应非静态函数;此函数主要用于获取Java定义的类
非静态函数是否存在,返回bool;
JniMethodInfo 类:此类型主要用户保存类结构体,可以通过JniHelper类的getStaticMethodInfo函数实例化JniMethodInfo对象,从而使用实例的env属性调用CallStaticVoidMethod,CallVoidMethod,CallStaticIntMethod等函数进行对保存的类结构调用函数;常用的函数如下:(静态系列函数)1. CallStaticVoidMethod(classID,methodID);2. CallStaticIntMethod(classID,methodID);3~(n-1) ……省略掉,童鞋们一看就明白;n. CallStaticObjectMethod(classID,methodID);带参数的函数:(如int类型)CallStaticVoidMethod(classID,methodID,int _int);非静态系列函数: 1. CallVoidMethod(jobj,methodID);2. CallIntMethod(jobj,methodID);3~(n-1) ……省略掉,童鞋们一看就明白;n. CallStaticObjectMethod(jobj,methodID);带参数的函数:(如int类型)CallVoidMethod(classID,methodID,int _int);这里讲解下几个参数函数:1. classID: 类ID , JniMethodInfo 对象包含此属性; 2. methdID: 方法ID,JniMethodInfo 对象也包含此属性; 3. jobj : java中Object类型,如自定义类,String…非静态函数调用的时候,需要的是对象,所以与静态函数调用的第一个参数不同; 那么既然能调用Java的函数,那就能得到函数返回值,但是这里我们得到的返回值书写类型如下:譬如返回int 类型,在Xcode中使用 jint 这种形式,更多形式如下:int -> jint…省略,大家一看就懂得;object -> jobject估计有的童鞋已经晕了,没关系,下面Himi写了一些例子代码,结合来看就一目了然啦。Xcode中先导入如下头文件:

//使用预编译,对当前平台为Android时才会导入如下头文件
 
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include <android/log.h>
#endif

示例代码段1:Xcode 代码:

 
////静态函数示例1.无参数,无返回值---------------------------------$$$-----------------------------
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    JniMethodInfo minfo;//定义Jni函数信息结构体
    //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
    bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/ai/ommr/OhMonsterMR4Android","testFun", "()V"); 
 
    if (!isHave) {
        CCLog("jni:此函数不存在");
    }else{
        CCLog("jni:此函数存在");
        //调用此函数
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
    }
    CCLog("jni-java函数执行完毕");
#endif

Android(Java) 代码:

// 静态函数示例1.无参数,无返回值
public static void testFun() {
    Log.e("Himi", "静态函数示例1.无参数,无返回值");
}

运行截图:http://www.himigame.com/wp-content/uploads/2012/04/0000.png

示例代码段2:Xcode 代码:

//静态函数示例2.有参数,无返回值------------------------------$$$$--------------------------------
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    JniMethodInfo minfo;//定义Jni函数信息结构体
    //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
    bool isHave = JniHelper::getStaticMethodInfo(minfo,
                                                "com/ai/ommr/OhMonsterMR4Android", "testFunWithInt","(I)V");  
 
    if (!isHave) {
        CCLog("jni:此函数不存在");
    }else{
        CCLog("jni:此函数存在");
        //调用此函数
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,823);
    }
    CCLog("jni-java函数执行完毕");
#endif

Android(Java) 代码:

// 静态函数示例2.有参数,无返回值
public static void testFunWithInt(int _int) {
    Log.e("Himi", "静态函数示例1.有参数,无返回值;传入的参数int=" + _int);
}

运行截图: http://www.himigame.com/wp-content/uploads/2012/04/111.png

  • 本帖最后由 romejiang 于 2012-4-18 11:57 编辑 *

http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=308&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=310&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=312&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=314&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=316&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=318&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=320&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=322&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=324&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=326&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=328&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=330&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=332&extra=page%3D1
http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=334&extra=page%3D1

果断mark—