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
     
  • 相关阅读:
    THUSC2019游记
    2019-8-2-WPF-从文件加载字体
    2019-8-2-WPF-从文件加载字体
    2018-8-10-VisualStudio-合并代码文件
    2018-8-10-VisualStudio-合并代码文件
    2018-8-10-UWP-分享用那个图标
    2018-8-10-UWP-分享用那个图标
    2018-8-10-WPF-可获得焦点属性
    2018-8-10-WPF-可获得焦点属性
    2018-8-10-WPF-好看的矢量图标
  • 原文地址:https://www.cnblogs.com/SkyflyBird/p/11907489.html
Copyright © 2011-2022 走看看