zoukankan      html  css  js  c++  java
  • cocos C++调用java

    参考:

    https://blog.csdn.net/u010912122/article/details/19341565 

    原理:

    通过JNI获取java虚拟机,再获取当前程序的JNI环境,通过JNI环境获取需要调用的java类信息,再获取需要调用的java类中的函数信息。再通过JNI环境调用,使用类信息、函数信息,调用对应的java函数。

    实现:

    cocos2dx 封装了一个JniHelper的类,主要通过如下接口实现C++调用java

    typedef struct JniMethodInfo_
    {
        JNIEnv *    env;           //
        jclass      classID;       //
        jmethodID   methodID;      //
    } JniMethodInfo;    
    
    /*
    methodinfo:JniMethodInfo的引用,将引用中的env,classID,methodID
    className: java类的完全路径
    methodName: java类方法
    paramCode: 函数类型简写

    注意:两个方法的唯一不同处,是前者调用java中的static方法,后者调用普通的方法
    */ static bool getStaticMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode); static bool getMethodInfo(JniMethodInfo &methodinfo, const char *className, const char *methodName, const char *paramCode);

    示例:

    // 摘录于: cddandroidAndroidJavaEngine.cpp
    void AndroidJavaEngine::playBackgroundMusic(const char* filePath, bool loop) {
        std::string fullPath = CocosDenshion::android::getFullPathWithoutAssetsPrefix(filePath);
    
        cocos2d::JniMethodInfo methodInfo;
    
        // 判定能否获取java中的playBackgroundMusic方法
        if (!getStaticMethodInfo(methodInfo, "playBackgroundMusic", "(Ljava/lang/String;Z)V")) {
            return;
        }
        // 将C++中的char*类型通过NewStringUTF转换为Java中的jstring类型
        jstring stringArg = methodInfo.env->NewStringUTF(fullPath.c_str());
        // 通过JniEnv调用java中的指定方法,并将参数传进去 
        methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg, loop);
        // 
        methodInfo.env->DeleteLocalRef(stringArg);
        methodInfo.env->DeleteLocalRef(methodInfo.classID);
    }
    // 摘录:cocos2dxHelper.java
    public static void playBackgroundMusic(final String pPath, final boolean isLoop) {
        Cocos2dxHelper.sCocos2dMusic.playBackgroundMusic(pPath, isLoop);
    }

    解析

    1. getStaticMethodInfo

    第1个参数methodInfo 将jniEnv, classId, methodId 写入到引用中

    第2,3个参数将className, methodName写入

    第4个参数paramCode,其格式为: (参数简写)返回类型简写

    参数类型 简写 参数类型 简写
    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;     

    比如:

     2. CallStaticIntMethod

    JniEnv在调用指定的java函数时,会根据java的函数返回类型选择不同的方法们。它们都有着类似的特点,比如:
    -- CallStaticVoidMethod  调用的是 static void 类型方法
    -- CallStaticStringMethod 调用的是 static String类型方法
    -- CallIntMethod 表示调用的是 int类型的方法
    因此我们可以理解方法有着这样的格式: 
    Call[是否静态][返回类型]Method

    而且针对于[返回类型]所对应的关系如下:

    C++返回类型编写 对应java返回类型 C++返回类型编写 java方法返回类型
    Void void Short jshort
    Object jobject Int jint
    Boolean jboolean Long jlong
    Byte jbyte Float jfloat
    Char jchar Double jdouble
    在调用该方法时,我们传入的参数主要有三组:
    1. classID
    2. methodID
    3. C++调用java方法所需要的自定义参数
    其中针对于第3组,我们需要将C++转换为java的指定格式,类似于如上字符串的转换:
    // 将C++中的char*类型通过NewStringUTF转换为Java中的jstring类型
    jstring stringArg = methodInfo.env->NewStringUTF(fullPath.c_str());

    而针对于整型类型的转化,我们可以直接强制转换,比如:

    // C++ int 转换为java jint
    jint jx = (int)x;
    jint jy = (int)y;

    他们参数类型对应的转换关系如下:

    C++类型 Java类型 C++类型    Java类型     

    boolean

    jboolean

    boolean[]

    jbooleanArray 

    byte

    jbyte

    byte[]

    jbyteArray

    char

    jchar

    char[]

    jcharArray

    short

    jshort

    short[]

    jshortArray

    int

    jint

    int[]

    jintArray
    long jlong long[] jlongArray

    float

    jfloat

    float[]

    jfloatArray

    doubule

    jdouble

    double[]

    jdoubleArray

    Object

    jobject

    Oject[]

    jobjectArray
    Class jclass String jstring
     
  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/SkyflyBird/p/11907489.html
Copyright © 2011-2022 走看看