具体动作:
点击登陆后,客户端需提取设备码提交到服务器,出现崩溃问题;
logcat错误信息如下:
12-16 16:58:53.645: E/dalvikvm(19006): JNI ERROR (app bug): accessed stale weak global reference 0xffffffff (index 65535 in a table of size 0)
12-16 16:58:53.645: E/dalvikvm(19006): VM aborting
12-16 16:58:53.645: A/libc(19006): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 19021 (Thread-1317)
使用万能的ndk-stack -sym 跟踪
********** Crash dump: **********
Build fingerprint: 'samsung/lt01wifizc/lt01wifi:4.2.2/JDQ39/T310ZCUAMJ1:user/release-keys'
pid: 19006, tid: 19021, name: Thread-1317 >>> package name <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
Stack frame #00 pc 00045cd8 /system/lib/libdvm.so (dvmAbort+75)
Stack frame #01 pc 0002862c /system/lib/libdvm.so (IndirectRefTable::get(void*) const+336)
Stack frame #02 pc 0004a2a1 /system/lib/libdvm.so (dvmDecodeIndirectRef(Thread*, _jobject*)+132)
Stack frame #03 pc 0004b191 /system/lib/libdvm.so
Stack frame #04 pc 003b5ccc /data/app-lib/package name-1/libgame.so (_JNIEnv::GetStringUTFChars(_jstring*, unsigned char*)+48): Routine GetStringUTFChars in (null):0
Stack frame #05 pc 005f8110 /data/app-lib/package name/libgame.so: Routine jstring2string_ in /Users/chenxu/work/c++/cocos2d-x-2.1.4/work/appname/proj.android/../../../cocos2dx/platform/android/jni/JniHelper.cpp:174
Crash dump is completed
目标代码:原因可能是拿不到imei,所以数值为空;
//查看设备唯一码
std::string NativeCallJni::getImei()
{
LoggerUtil::getLogger()->logInfo(__FUNCTION__);
std::string imeiStr = "";
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
{
JniMethodInfo mInfo;//定义Jni函数信息结构体
bool isHave = JniHelper::getStaticMethodInfo(mInfo,JNI_CLASS_PATH,"getIMEI","()Ljava/lang/String;");
if (isHave)
{
jstring imei = (jstring)mInfo.env->CallStaticObjectMethod(mInfo.classID,mInfo.methodID);
imeiStr = JniHelper::jstring2string(imei);
}
}
#endif
return imeiStr;
}
cocos2dx的JniHelper.cpp代码
static string jstring2string_(jstring jstr)
{
if (jstr == NULL)
{
return "";
}
JNIEnv *env = 0;
if (! getEnv(&env))
{
return 0;
}
#此处报错android4.0严格,如果输入值为空,则崩溃
const char* chars = env->GetStringUTFChars(jstr, NULL);
string ret(chars);
env->ReleaseStringUTFChars(jstr, chars);
return ret;
}
}
崩溃的原因应该明白了,就是在提取不到imei的情况下,
jstring imei = (jstring)mInfo.env->CallStaticObjectMethod(mInfo.classID,mInfo.methodID);
iemi = null的话调用
imeiStr = JniHelper::jstring2string(imei);
此处报错android4.0严格,如果输入值为空,则崩溃
现在的解决办法就是获取一个能够替代deviceid的其他的特征码。我这里考虑采用cpu serial作为唯一码
具体代码如下
private static String getIdentifierByCpu() {
String identifier = "";
String cmdStr = "cat /proc/cpuinfo";
Process process;
try {
process = Runtime.getRuntime().exec(cmdStr);
InputStreamReader reader = new InputStreamReader(
process.getInputStream());
LineNumberReader lineReader = new LineNumberReader(reader);
String line = "";
while ((line = lineReader.readLine()) != null) {
if (line.startsWith("Serial")) {
identifier = line.split(":")[1];
Log.i(TAG, identifier);
}
}
} catch (IOException e) {
Log.e(TAG, e.getMessage());
}
return identifier;
}
测试验证通过。今天又了解一个通过linux 命令行获取系统信息的方法,就是 Runtime.getRuntime().exec(cmd)
另外小技巧。tab3的debug模式,需要google下,挺有意思的打开方式,各位自己动手下吧。
下次碰到有意思的问题,继续分享给大家。
分享到:
相关推荐
在Android项目中嵌入Cocos2dx项目是一个常见的需求,特别是在开发混合式游戏或应用时。Cocos2dx是一款高效的游戏开发框架,它基于C++,同时提供了Java、Objective-C和Swift的接口,使得开发者可以方便地在Android和...
这不仅可以解决UIWebView的弃用问题,还能获取到Cocos2dx的最新特性和优化。 2. **手动替换UIWebView为WKWebView**:如果你无法或不想升级Cocos2dx,你可以选择手动替换。你需要找到Cocos2dx引擎中的`UIWebViewImpl...
在Cocos2dx 2.x版本中播放MP4格式的视频文件是一项常见的需求,尤其是在开发游戏或者多媒体应用时。Cocos2dx是一个基于C++的游戏开发框架,它提供了丰富的功能来帮助开发者创建2D和3D游戏。在这个场景中,我们将深入...
《使用SublimeText高效启动Cocos2dx3.0项目》 Cocos2dx是一款强大的跨平台游戏开发框架,而SublimeText则是一款备受开发者喜爱的文本编辑器,以其高效、轻便和丰富的插件系统著称。将两者结合,可以极大地提升Cocos...
《Cocos2d-x 3.x游戏开发之旅》是一本深度探讨Cocos2dx 3.x框架的游戏开发专著,适合对游戏编程有兴趣并有一定基础的开发者。Cocos2dx是一个开源的游戏开发框架,它基于C++,同时支持多种语言,如Lua和JavaScript,...
把文件放在 tools\cocos2d-console\bin 路径下 修改bat 文件运行会自动出轨年项目
《基于Cocos2dx的游戏开发实例解析》 Cocos2dx是一个开源的游戏开发框架,它基于C++,并提供对多种编程语言的支持,包括Lua和JavaScript。本实例以"基于cocos2dx的一个小例子"为主题,展示了如何利用Cocos2dx进行...
《Cocos2dx工具解析:聚焦CocosBuilder》 Cocos2dx是一个广泛使用的开源游戏开发框架,基于C++,支持跨平台的游戏开发,适用于iOS、Android、Windows等多个平台。在Cocos2dx的生态系统中,有一系列强大的辅助工具,...
8. **学习资源**:为了更好地利用Cocos2dx,建议学习C++基础知识,熟悉Cocos2d-x的API文档,以及查阅官方教程和社区论坛,如Cocos2d-x的GitHub仓库和官方论坛,那里有许多开发者分享的经验和解决问题的方法。...
基于cocos2dx3.2的ScrollView改良版,...由于cocos库太大,压缩包里已经移除cocos核心库,需要自行下载安装cocos2dx 3.2版本,并任意生成一个cocos2dx项目,把里面的cocos文件夹复制到ScrollViewDemo文件夹下即可。
3. **Shader程序**:OpenGL ES 2.0及更高版本支持自定义着色器,这在Cocos2dx中得到充分利用。我们可以编写顶点和片段着色器,以计算水波纹的位移和颜色变化。顶点着色器处理位置信息,片段着色器则处理颜色和透明度...
在游戏开发领域,Cocos2dx是一款广泛使用的开源游戏引擎,它基于C++,并提供了对多种平台的支持,包括iOS。本资源包含了斗地主游戏的服务端和客户端代码,这为我们提供了一个深入理解如何构建一款跨平台游戏的机会。...
- 打开`cocos2d-x/cocos2d-win32.vs2008.sln`解决方案,在Visual Studio中创建新的cocos2d-win32应用项目,如"Cocos2dxSimpleGame"。 - 确保不勾选Box2D(若项目不需要物理引擎),但选择"SimpleAudioEngine in ...
在游戏开发领域,cocos2dx是一个广泛使用的开源游戏引擎,尤其在跨平台开发中扮演着重要角色。本篇将深入探讨cocos2dx游戏开发系列的第三部分——源码解析和Android工程的创建与迁移。 首先,cocos2dx是基于C++的,...
cocos2dx可用3d粒子编辑器,支持pc、mac、iphone、android等平台
包括图形渲染、物理引擎、事件处理、资源管理以及游戏逻辑等,对于想要学习游戏开发的程序员来说,这是一个很好的实践项目,可以深入理解cocos2dx框架及其在实际项目中的应用。在“Classes”目录下,通常包含游戏的...
“cocos2dx单机大富翁游戏源码”是一个基于cocos2dx框架开发的休闲娱乐游戏项目,旨在为开发者提供一个学习和参考的实例,帮助他们理解和掌握cocos2dx引擎在实际游戏开发中的应用。下面,我们将深入探讨cocos2dx框架...
在iOS开发中,COCOS2DX是一款广泛使用的2D游戏开发框架,它基于C++,为开发者提供了高效的游戏开发工具。本主题聚焦于如何利用COCOS2DX实现线程后台运作以及推送通知功能,特别是在用户按下HOME键后进入后台模式时。...
【cocos2dx 超级玛丽 demo 源码】是基于cocos2dx游戏引擎开发的一个经典游戏“超级玛丽”的示例项目。cocos2dx是一个开源的游戏开发框架,它采用C++编写,同时支持iOS、Android等多个平台,为开发者提供了高效且便捷...