我有这段代码,我从我的游戏支持的不同类型的设备中收集设备ID,并设置lua global以具有当前设备的id值。 当我得到iOS设备的id时,我从一个混合的C ++ / Objective-C类接收一个const char *并将它传递给Lua堆栈。一切正常。 但是我从一段负责获取Android设备ID的代码中收到std :: string。当我推送deviceId.c_str()时,我在Lua中得到nil。 我已经尝试从负责获取设备ID的代码中传递const char *,但是当它从函数返回时,指针似乎出现了错误[这就是为什么我决定返回字符串,它以这种方式工作正常]。
如何允许从std :: string中传递const char *而不会出现问题?
编辑: 我尝试过使用strcpy,但它不起作用:/仍然有同样的问题。
所以..负责从不同设备收集deviceId的代码如下所示:
#include "DeviceInfo.h"
#include "DeviceInfoIOS.h"
#include "DeviceInfoAndroid.h"
#include <string>
USING_NS_CC;
extern "C" {
const char *getDeviceId() {
const char *deviceId;
CCLog("test");
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
DeviceInfoIOS ios;
deviceId = ios.getIOSDeviceId();
CCLog("iOS platform %s", deviceId);
#endif // CC_PLATFORM_IOS
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
CCLog("Android platform");
std::string tempId = getAndroidDeviceId();
CCLog("Android platform test %s", tempId.c_str());
char y[tempId.size() + 1];
strcpy(y, tempId.c_str());
deviceId = (const char*) y;
CCLog("Android platform %s", deviceId);
#endif // CC_PLATFORM_ANDROID
CCLog("Finished platform check");
return deviceId;
}
}
只是一个小小的注释:所有日志看起来都不错。 Devie id很好。
这是我将设备ID传递给Lua的方式:
//deviceInfo
CCLog("DeviceInfo load");
const char *deviceId = getDeviceId();
CCLog("DeviceInfo %s", deviceId);
lua_pushstring(d_state, deviceId);
lua_setglobal(d_state, "DEVICE_ID");
同样在这里,logfile包含设备ID。
答案 0 :(得分:2)
您的getDeviceId
功能已损坏。 tempId
和y
都是堆栈变量。返回后,它们将被销毁。返回指向堆栈变量的指针总是一个坏主意。
你的功能应该返回std::string
。如果失败了,它应该返回一个分配 char*
的{{1}}数组,并且该用户应该使用new
解除分配。这通常是为什么最好只返回delete
。或者,您可以使用固定大小(而不是基于字符串的大小)将std::string
作为y
局部变量进行delcare。