zoukankan      html  css  js  c++  java
  • cocos2d-x笔记5: 通过jni实现C++调用Java

    Cocos2d-x的跨平台性很强大,但是偶尔也需要平台的原生API结合。

    C++在Win32平台下简单的很,C++可以直接用MFC或者调用Win32API。

    Ios在XCode下直接就能C++和OC混编。

    而Android又一次悲剧了,C++既不是Android的原生语言,也没有IDE可以混编。。。

    我们只好通过jni来搞。

    Cocos2d-x 给我们提供了JniHelper类(良心!)。头文件 #include "platform/android/jni/JniHelper.h"。通过这个类我们可以很简单的调用Java代码的类方法,这里引用一下Cocos2d-x官方文档:

    最重要的两个方法:

    getStaticMethodInfo、getMethodInfo

    getStaticMethodInfo

    getStaticMethodInfo调用Java静态方法的方法:

    getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode)

    • 第一个参数为JniMethodInfo,为一个容器类,表示当前调用的方法

    • 第二个参数为调用Java方法类的全名

    • 第三个参数为调用java的方法名,也就是参数为方法的参数类型

    java与Jni对应的参数类型如下:

    ava类型对应的签名
    boolean Z
    byte B
    char C
    short S
    int I
    long J
    float F
    double D
    void V
    Object Ljava/lang/String
    Array Ljava/lang/String
    • 第四个参数为返回类型
    getMethodInfo

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

    JniMethodInfo

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

    示例代码:

    JniMethodInfo t;
    bool isHave = JniHelper::getStaticMethodInfo(t,
                                                 "com/weibo/test/WeiboHelper",  //需要调用的Java文件
                                                 "toast",//调用的方法名
                                                 "()V");//参数

    文档就这些。。有点不够用,所以我就是来补充的。。。

    到这里只是引用了目标方法,调用静态方法需要通过 CallStatic**Method(classID, methodID) 函数,其中 “**” 可以是Int等基本类型、Object、Void。

    调用非静态方法就有对应的Call**Method(classID, methodID) 函数。

    最后是示例:

     1 JniMethodInfo minfo;
     2 bool isHave = JniHelper::getStaticMethodInfo(minfo,
     3     "com/red/test/Test",
     4     "cppTest",
     5     "()V");
     6 
     7 if (isHave)
     8 {
     9     minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
    10 }
  • 相关阅读:
    微信小程序开发前期准备
    怎样在vs2013和vs2015中实现自动编译sass
    在MVC中使用Bundle打包压缩js和css
    Html5 突破微信限制实现大文件分割上传
    Automapper 实现自动映射
    Polly一种.NET弹性和瞬态故障处理库(重试策略、断路器、超时、隔板隔离、缓存、回退、策略包装)
    关于transactionscope 事务的脏数据
    IIS设置session时长
    已禁用对分布式事务管理器(MSDTC)的网络访问的解决方法之一
    DAL.SQLHelper 的类型初始值设定项引发异常的处理
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/3720344.html
Copyright © 2011-2022 走看看