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备忘,等待专家帮忙解答。
常规的方法是通过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备忘,等待专家帮忙解答。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Cocos2d-x中背景音乐和音效使用实例
- Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验
- Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例
- Cocos2d-x UI开发之文本类使用实例
- Cocos2d-x保存用户游戏数据之XML文件是否存在问题判断方法
- Cocos2d-x UI开发之菜单类使用实例
- Cocos2d-x UI开发之CCControlButton控件类实例
- Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系
- Cocos2d-x UI开发之CCControlColourPicker控件类使用实例
- Cocos2d-x学习笔记之CCLayerColor层的使用实例
- Cocos2d-x Schedule定时器的使用实例
- Cocos2d-x中使用CCScrollView来实现关卡选择实例
- Cocos2d-x中CCEditBox文本输入框的使用实例
- cocos2d-x学习笔记之CCLayer、CCLayerColor、CCLayerGradient、CCLayerMultiplex场景层介绍
- Cocos2d-x UI开发之CCControlSlider控件类使用实例
- Cocos2d-x学习笔记之开发环境搭建
- Cocos2d-x学习笔记之Hello World!