zoukankan      html  css  js  c++  java
  • 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类型!

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


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

    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中先导入如下头文件:

    1. //使用预编译,对当前平台为Android时才会导入如下头文件

    2. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    3. #include <jni.h>
    4. #include "platform/android/jni/JniHelper.h"
    5. #include <android/log.h>
    6. #endif
    复制代码

    示例代码段1:

    Xcode 代码:

    1. 静态函数示例1.无参数,无返回值---------------------------------$-----------------------------
    2. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    3.     JniMethodInfo minfo;//定义Jni函数信息结构体
    4.     //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
    5.     bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/ai/ommr/OhMonsterMR4Android","testFun", "()V"); 

    6.     if (!isHave) {
    7.         CCLog("jni:此函数不存在");
    8.     }else{
    9.         CCLog("jni:此函数存在");
    10.         //调用此函数
    11.         minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
    12.     }
    13.     CCLog("jni-java函数执行完毕");
    14. #endif
    复制代码

    Android(Java) 代码:

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

    运行截图:

    0000.png


    示例代码段2:

    Xcode 代码:

    1. //静态函数示例2.有参数,无返回值------------------------------$--------------------------------
    2. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    3.     JniMethodInfo minfo;//定义Jni函数信息结构体
    4.     //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
    5.     bool isHave = JniHelper::getStaticMethodInfo(minfo,
    6.                                                 "com/ai/ommr/OhMonsterMR4Android", "testFunWithInt","(I)V");  

    7.     if (!isHave) {
    8.         CCLog("jni:此函数不存在");
    9.     }else{
    10.         CCLog("jni:此函数存在");
    11.         //调用此函数
    12.         minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID,823);
    13.     }
    14.     CCLog("jni-java函数执行完毕");
    15. #endif
    复制代码

    Android(Java) 代码:

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

    运行截图:

    111.png 

    示例代码段3:

    Xcode 代码:

    1. //静态函数示例3.有参数,有返回值--------------------------------$--------------------------------
    2. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    3.     JniMethodInfo minfo;//定义Jni函数信息结构体
    4. //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数

    5. bool isHave = JniHelper::getStaticMethodInfo(minfo,
    6.                                              "com/ai/ommr/OhMonsterMR4Android","testFunWithIntAndRtn","(I)I");
    7. jint _int ;
    8. if (!isHave) {
    9.     CCLog("jni:此函数不存在");
    10. }else{
    11.     CCLog("jni:此函数存在");
    12.     //调用此函数
    13.     _int = minfo.env->CallStaticIntMethod(minfo.classID, minfo.methodID,823);

    14.     //尝试jint是否能正常接收返回的int值
    15.     JniMethodInfo minfo_ty;
    16.     bool isHave = JniHelper::getStaticMethodInfo(minfo_ty, "com/ai/ommr/OhMonsterMR4Android", "testFunWithInt",  "(I)V");
    17.      if (isHave) {
    18.          minfo_ty.env->CallStaticVoidMethod(minfo_ty.classID, minfo_ty.methodID,_int);
    19.      }

    20. }
    21. CCLog("jni-java函数执行完毕");
    22. #endif
    复制代码

    Android(Java) 代码:

    1. // 静态函数示例3.有参数,有返回值
    2. public static int testFunWithIntAndRtn(int _int) {
    3.     Log.e("Himi", "静态函数示例1.有参数,有返回值;传入的参数int=" + _int);
    4.     return _int+1000;
    5. }
    复制代码

    运行截图:

    2222.png 

    示例代码段4:

    Xcode 代码:

    1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    2.     JniMethodInfo minfo;//定义Jni函数信息结构体
    3.     //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
    4.     bool isHave = JniHelper::getStaticMethodInfo(minfo,  "com/ai/ommr/OhMonsterMR4Android","testFunWithStringAndRtn","(I)Ljava/lang/String;");
    5.     jobject jobj;
    6.     if (!isHave) {
    7.         CCLog("jni:此函数不存在");
    8.     }else{
    9.         CCLog("jni:此函数存在");
    10.         //调用此函数
    11.         jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID,823);
    12.     }
    13.     CCLog("jni-java函数执行完毕");
    14. #endif
    复制代码
    Android(Java) 代码:
    1. // 静态函数示例4.有参数,有返回值(String类型)
    2. public static String testFunWithStringAndRtn(int _int) {
    3.     Log.e("Himi", "静态函数示例4.有参数,有返回值(String类型);int=" + _int);
    4.     return "yes,return 'String' is OK --by Himi";
    5. }
    复制代码

    运行截图:

    3333.png 

    示例代码段5:

    Xcode 代码:

    1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
    2.     JniMethodInfo minfo;//定义Jni函数信息结构体
    3.     //getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
    4.     bool isHave = JniHelper::getStaticMethodInfo(minfo,
    5.                                                 "com/ai/ommr/OhMonsterMR4Android",  //类的路径
    6.                                                 "rtnActivity",   //方法名
    7.                                                 "()Ljava/lang/Object;");   //括号里的是参数,后面的是返回值。
    8.     jobject jobj;
    9.     if (isHave) {
    10.        jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
    11.     }
    12.     CCLog("正确获取到 jobj");

    13.     //
    14.     isHave = JniHelper::getMethodInfo(minfo,
    15.                                                  "com/ai/ommr/OhMonsterMR4Android",  //类的路径
    16.                                                  "nostaticFun",   //方法名
    17.                                                  "()V");   //括号里的是参数,后面的是返回值。  

    18.     if (isHave) {
    19.          minfo.env->CallVoidMethod(jobj, minfo.methodID);
    20.     }
    21.      CCLog("jni-java函数执行完毕");
    22. #endif
    复制代码
    Java 代码:
    1. //---- 函数示例之非静态函数调用
    2. //(先获取个对象)
    3. public static Activity actInstance;//定义单例
    4. public static Object rtnActivity() {
    5.     return actInstance;
    6. }
    7. //使用此对象进行调用非静态函数
    8. public void nostaticFun() {
    9.     Log.e("Himi", "no static Function is OK - By Himi");
    10. }
    复制代码

    运行截图:

    4444.png 

    转自 http://blog.csdn.net/xiaominghimi/article/details/7602984
  • 相关阅读:
    CodeForces
    CodeForces-1253B(贪心+模拟)
    WebFlux、Reactive编程特性
    redis-on-windows配置解释
    SpringBoot配置方式补充
    如何在 Ubuntu 20.04 上安装 Python Pip
    MySQL之1055错误
    CuckooSandbox
    Manjaro 20.0.1 Lysia 安装Googlepinyin
    Manjaro 20.0.1 Lysia 更新国内镜像源
  • 原文地址:https://www.cnblogs.com/jrmy/p/14316319.html
Copyright © 2011-2022 走看看