您的位置:首页 > 移动开发 > Cocos引擎

Cocos2dx 项目 C++ 通过Jni 调用Java获取字符串信息错乱

2016-05-26 10:21 751 查看
Cocos2dx项目,Android版本需要获得安卓手机的设备识别码imei、mac地址、系统版本号等信息。

常规的方法是通过Jni,由C++
调用Java的接口获取相关信息。

1、在Java
的Cocos2dxHelper.java中添加四个函数:


//调用Java获取Android设备的imei

public static String getImei(){}

//调用Java获取Android设备的MacAddress

public static String getMacAddress(){}

//调用Java获取Android设备的系统版本号

public static String getSysVersion(){}

//调用Java获取Android设备信息

public static String getDeviceInfo(){

      return imei + macadd + sysver;

}

2、在C++
定义了中间函数


//调用Java获取Android设备的组合信息

    const char* getDeviceInfo(){

        JniMethodInfo t;

        if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "getDeviceInfo", "()Ljava/lang/String;")) {

            jstring jInfo = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);

            std::string strInfo = JniHelper::jstring2string(jInfo);

            return strInfo.c_str();

        }else{

            return "";

        }

    }

    

    //调用Java获取Android设备的imei

    const char* getImei(){

        JniMethodInfo t;

        if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "getImei", "()Ljava/lang/String;")) {

            jstring jImei = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);

            std::string strImei = JniHelper::jstring2string(jImei);

            return strImei.c_str();

        }else{

            return "";

        }

    }

    

    //调用Java获取Android设备的MacAddress

    const char* getMacAddress(){

        JniMethodInfo t;

        if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "getMacAddress", "()Ljava/lang/String;")) {

            jstring jMac = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);

            std::string strMac = JniHelper::jstring2string(jMac);

            return strMac.c_str();

        }else{

            return "";

        }

    }

    //调用Java获取Android设备的系统版本号

    const char* getSysVersion(){

        JniMethodInfo t;

        if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "getSysVersion", "()Ljava/lang/String;")) {

            jstring jVer = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);

            std::string strVer = JniHelper::jstring2string(jVer);

            return strVer.c_str();

        }else{

            return "";

        }

    }

3、在AppDelegate.cpp中分别调用中间函数获取Android信息

const char* sImei   = getImei();

const char* sMac  = getMacAddress();

const char* sSysVer = getSysVersion();

const char* sDeviceInfo = getDeviceInfo();

最后,问题来了:

用MessageBox
显示出来的sImei、sMac、sSysVer和
sDeviceInfo 内容不同!


而且sImei、sMac、sSysVer经常变化,像是内存错乱的感觉。

而在Java端写的Log明明是对的,为什么到C++后就乱了?

sDeviceInfo是为了解决分别获取信息时信息错乱设计的,

可是这个sDeviceInfo返回的信息有时候也会有错误!

这就要命了!程序无法正常工作。

百思不得其解,写Blog备忘,等待专家帮忙解答。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Cocos2d-x Jni imei