zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

【IOS-COCOS2D-X 游戏开发之十三】详细讲解在XCODE中利用预编译并通过JNI调用ANDROID的JAVA层代码(COCOS2DX里访问调用ANDROID函数)!

2023-09-14 08:59:36 时间

此函数主要用于获取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,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中先导入如下头文件:


////静态函数示例1.无参数,无返回值---------------------------------$$$$$$----------------------------- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台     JniMethodInfo minfo;//定义Jni函数信息结构体
    bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/ai/ommr/OhMonsterMR4Android","testFun", "()V");     if (!isHave) {
//静态函数示例2.有参数,无返回值------------------------------$$$$$$$-------------------------------- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台     JniMethodInfo minfo;//定义Jni函数信息结构体
                                                "com/ai/ommr/OhMonsterMR4Android", "testFunWithInt","(I)V");       if (!isHave) {
//静态函数示例3.有参数,有返回值--------------------------------$$$$$$$-------------------------------- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台     JniMethodInfo minfo;//定义Jni函数信息结构体 //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数 bool isHave = JniHelper::getStaticMethodInfo(minfo,
                                             "com/ai/ommr/OhMonsterMR4Android","testFunWithIntAndRtn","(I)I");
    bool isHave = JniHelper::getStaticMethodInfo(minfo_ty, "com/ai/ommr/OhMonsterMR4Android", "testFunWithInt",  "(I)V");
         minfo_ty.env- gt;CallStaticVoidMethod(minfo_ty.classID, minfo_ty.methodID,_int);
    bool isHave = JniHelper::getStaticMethodInfo(minfo,  "com/ai/ommr/OhMonsterMR4Android","testFunWithStringAndRtn","(I)Ljava/lang/String;");
        jobj = minfo.env- gt;CallStaticObjectMethod(minfo.classID, minfo.methodID,823);
                                                "com/ai/ommr/OhMonsterMR4Android",  //类的路径
                                                "()Ljava/lang/Object;");   //括号里的是参数,后面的是返回值。
                                                 "com/ai/ommr/OhMonsterMR4Android",  //类的路径