cocos2dx里访问调用Android函数

前端之家收集整理的这篇文章主要介绍了cocos2dx里访问调用Android函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

首先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类型!

大概说两个童鞋们应该基本理解了,那么下面详细写一些对照表,留给大家对照;

参数、返回值样式对照表:


这里的签名指的就是getStaticMethodInfo函数第三个参数中传入的样式;

2. getMethodInfo类似与第一个函数,只是对应非静态函数;此函数主要用于获取Java定义的类非静态函数是否存在,返回bool;

JniMethodInfo类:

此类型主要用户保存类结构体,可以通过JniHelper类的getStaticMethodInfo函数实例化JniMethodInfo对象,从而使用实例的env属性调用CallStaticVoidMethod,CallVoidMethod,CallStaticIntMethod等函数进行对保存的类结构调用函数

常用的函数如下:(静态系列函数)

1.CallStaticVoidMethod(classID,methodID);

2. CallStaticIntMethod(classID,sans-serif; font-size:14px; line-height:21px"> 3~(n-1) ……省略掉,童鞋们一看就明白;

n. CallStaticObjectMethod(classID,sans-serif; font-size:14px; line-height:21px"> 带参数的函数:(如int类型)

CallStaticVoidMethod(classID,methodID,int _int);

非静态系列函数

1.CallVoidMethod(jobj,sans-serif; font-size:14px; line-height:21px"> 2. CallIntMethod(jobj,sans-serif; font-size:14px; line-height:21px"> n. CallStaticObjectMethod(jobj,sans-serif; font-size:14px; line-height:21px"> CallVoidMethod(classID,sans-serif; font-size:14px; line-height:21px"> 这里讲解下几个参数函数

1. classID: 类ID, JniMethodInfo 对象包含此属性

2. methdID: 方法ID,JniMethodInfo 对象也包含此属性

3. jobj: java中Object类型,如自定义类,String…

非静态函数调用的时候,需要的是对象,所以与静态函数调用的第一个参数不同;

那么既然能调用Java的函数,那就能得到函数返回值,但是这里我们得到的返回值书写类型如下:

譬如返回int 类型,在Xcode中使用 jint 这种形式,更多形式如下:

int->jint

…省略,大家一看就懂得;

object ->jobject

估计有的童鞋已经晕了,没关系,下面Himi写了一些例子代码,结合来看就一目了然啦。

Xcode中先导入如下头文件

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

Xcode 代码:

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

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

    示例代码段2:

    1. //静态函数示例2.有参数,无返回值------------------------------$--------------------------------
    2. "com/ai/ommr/OhMonsterMR4Android","testFunWithInt","(I)V");
      1. // 静态函数示例2.有参数,无返回值
      2. public static void testFunWithInt(int _int) {
      3. 运行截图:



        示例代码段3:

          @H_169_301@ //静态函数示例3.有参数,有返回值--------------------------------$--------------------------------
          @H_169_301@ //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
          @H_169_301@ "com/ai/ommr/OhMonsterMR4Android","testFunWithIntAndRtn","(I)I");
          @H_169_301@ jint _int ;
          @H_169_301@ if (!isHave) {
          @H_169_301@ }else{
          @H_169_301@ _int = minfo.env->CallStaticIntMethod(minfo.classID,serif; font-size:12px; line-height:1.8em"> //尝试jint是否能正常接收返回的int值
          @H_169_301@ JniMethodInfo minfo_ty;
          @H_169_301@ bool isHave = JniHelper::getStaticMethodInfo(minfo_ty,serif; font-size:12px; line-height:1.8em"> if (isHave) {
          @H_169_301@ minfo_ty.env->CallStaticVoidMethod(minfo_ty.classID,minfo_ty.methodID,_int);
          @H_169_301@ }
          @H_169_301@ }
          @H_169_301@ CCLog("jni-java函数执行完毕");
          1. @H_169_301@ // 静态函数示例3.有参数,有返回值
            @H_169_301@ public static int testFunWithIntAndRtn(int _int) {
          2. 函数示例1.有参数,有返回值;传入的参数int=" + _int);
          3. @H_169_301@ return _int+1000;
          4. 示例代码段4:

            1. jobject jobj;
            2. jobj = minfo.env->CallStaticObjectMethod(minfo.classID,153)!important">复制代码
            Android(Java) 代码:

            猜你在找的Cocos2d-x相关文章