
| 首先Himi大概的介绍一个类 JniHelper ; 此类主要用于Jni与Java层之间的相互访问的作用,那么此类的常用的一些函数这里首先介绍下,否则直接上代码不太容易吸收 ; JniHelper 类常用函数: 1.getStaticmethodInfo (四个参数,bool 返回值) 使用示例代码: 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类型! 大概说两个童鞋们应该基本理解了,那么下面详细写一些对照表,留给大家对照; 参数、返回值样式对照表:
这里的签名指的就是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,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,"()V"); if (!isHave) { cclog("jni:此函数不存在"); }else{ cclog("jni:此函数存在"); //调用此函数 minfo.env->CallStaticVoIDMethod(minfo.classID,minfo.methodID); } cclog("jni-java函数执行完毕"); 复制代码 AndroID(Java) 代码: @H_35_502@ // 静态函数示例1.无参数,无返回值public static voID testFun() { Log.e("Himi","静态函数示例1.无参数,无返回值"); } 复制代码 运行截图:
示例代码段2: Xcode 代码: //静态函数示例2.有参数,无返回值------------------------------$--------------------------------"com/aI/Ommr/OhMonsterMR4AndroID","testFunWithInt","(I)V"); // 静态函数示例2.有参数,无返回值 public static voID testFunWithInt(int _int) { 复制代码 运行截图: 示例代码段3: Xcode 代码: //静态函数示例3.有参数,有返回值--------------------------------$--------------------------------//getStaticmethodInfo 次函数返回一个bool值表示是否找到此函数 "com/aI/Ommr/OhMonsterMR4AndroID","testFunWithIntAndRtn","(I)I"); jint _int ; if (!isHave) { }else{ _int = minfo.env->CallStaticIntMethod(minfo.classID,serif; Font-size:12px; line-height:1.8em"> //尝试jint是否能正常接收返回的int值 JniMethodInfo minfo_ty; bool isHave = JniHelper::getStaticmethodInfo(minfo_ty,serif; Font-size:12px; line-height:1.8em"> if (isHave) { minfo_ty.env->CallStaticVoIDMethod(minfo_ty.classID,minfo_ty.methodID,_int); } } cclog("jni-java函数执行完毕"); // 静态函数示例3.有参数,有返回值 public static int testFunWithIntAndRtn(int _int) { return _int+1000; 复制代码 运行截图: 示例代码段4:Xcode 代码: jobject jobj;jobj = minfo.env->CallStaticObjectMethod(minfo.classID,153)!important">复制代码 Android(Java) 代码: // 静态函数示例4.有参数,有返回值(String类型) public static String testFunWithStringAndRtn(int _int) { return "yes,return 'String' is OK --by Himi"; 复制代码 运行截图: 示例代码段5:Xcode 代码: "rtnActivity",//方法名"()Ljava/lang/Object;"); //括号里的是参数,后面的是返回值。 if (isHave) { jobj = minfo.env->CallStaticObjectMethod(minfo.classID,serif; font-size:12px; line-height:1.8em"> CCLog("正确获取到 jobj"); // isHave = JniHelper::getMethodInfo(minfo,serif; font-size:12px; line-height:1.8em"> "com/ai/ommr/OhMonsterMR4Android",serif; font-size:12px; line-height:1.8em"> "nostaticFun",serif; font-size:12px; line-height:1.8em"> "()V"); //括号里的是参数,后面的是返回值。 minfo.env->CallVoidMethod(jobj,serif; font-size:12px; line-height:1.8em"> CCLog("jni-java函数执行完毕"); 复制代码 Java 代码: //---- 函数示例之非静态函数调用 //(先获取个对象) public static Activity actInstance;//定义单例 public static Object rtnActivity() { return actInstance; //使用此对象进行调用非静态函数 public void nostaticFun() { 复制代码 运行截图: 转自http://www.jb51.cc/article/p-bscvicvt-bha.html |
以上是内存溢出为你收集整理的关于cocos2d和安卓 详细介绍全部内容,希望文章能够帮你解决关于cocos2d和安卓 详细介绍所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)