`
nbtlxx
  • 浏览: 252722 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

cocos2dx项目在三星tab3设备码获取失败的闪退问题及解决

阅读更多
具体动作:
点击登陆后,客户端需提取设备码提交到服务器,出现崩溃问题;

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下,挺有意思的打开方式,各位自己动手下吧。

下次碰到有意思的问题,继续分享给大家。
0
0
分享到:
评论

相关推荐

    android项目中嵌入cocos2dx项目demo

    在Android项目中嵌入Cocos2dx项目是一个常见的需求,特别是在开发混合式游戏或应用时。Cocos2dx是一款高效的游戏开发框架,它基于C++,同时提供了Java、Objective-C和Swift的接口,使得开发者可以方便地在Android和...

    Cocos2dx中UIWebView替换为WKWebView

    这不仅可以解决UIWebView的弃用问题,还能获取到Cocos2dx的最新特性和优化。 2. **手动替换UIWebView为WKWebView**:如果你无法或不想升级Cocos2dx,你可以选择手动替换。你需要找到Cocos2dx引擎中的`UIWebViewImpl...

    cocos2dx-2.x播放mp4

    在Cocos2dx 2.x版本中播放MP4格式的视频文件是一项常见的需求,尤其是在开发游戏或者多媒体应用时。Cocos2dx是一个基于C++的游戏开发框架,它提供了丰富的功能来帮助开发者创建2D和3D游戏。在这个场景中,我们将深入...

    SublimeText启动cocos2dx3.0项目

    《使用SublimeText高效启动Cocos2dx3.0项目》 Cocos2dx是一款强大的跨平台游戏开发框架,而SublimeText则是一款备受开发者喜爱的文本编辑器,以其高效、轻便和丰富的插件系统著称。将两者结合,可以极大地提升Cocos...

    cocos2dx3.x游戏开发之旅电子版

    《Cocos2d-x 3.x游戏开发之旅》是一本深度探讨Cocos2dx 3.x框架的游戏开发专著,适合对游戏编程有兴趣并有一定基础的开发者。Cocos2dx是一个开源的游戏开发框架,它基于C++,同时支持多种语言,如Lua和JavaScript,...

    cocos2dx 创建项目

    把文件放在 tools\cocos2d-console\bin 路径下 修改bat 文件运行会自动出轨年项目

    基于cocos2dx的一个小例子

    《基于Cocos2dx的游戏开发实例解析》 Cocos2dx是一个开源的游戏开发框架,它基于C++,并提供对多种编程语言的支持,包括Lua和JavaScript。本实例以"基于cocos2dx的一个小例子"为主题,展示了如何利用Cocos2dx进行...

    cocos2dx 工具之CocosBuilder

    《Cocos2dx工具解析:聚焦CocosBuilder》 Cocos2dx是一个广泛使用的开源游戏开发框架,基于C++,支持跨平台的游戏开发,适用于iOS、Android、Windows等多个平台。在Cocos2dx的生态系统中,有一系列强大的辅助工具,...

    生成Cocos2dx项目

    8. **学习资源**:为了更好地利用Cocos2dx,建议学习C++基础知识,熟悉Cocos2d-x的API文档,以及查阅官方教程和社区论坛,如Cocos2d-x的GitHub仓库和官方论坛,那里有许多开发者分享的经验和解决问题的方法。...

    cocos2dx3.2的ScrollView改良

    基于cocos2dx3.2的ScrollView改良版,...由于cocos库太大,压缩包里已经移除cocos核心库,需要自行下载安装cocos2dx 3.2版本,并任意生成一个cocos2dx项目,把里面的cocos文件夹复制到ScrollViewDemo文件夹下即可。

    cocos2dx 3.x 水波纹

    3. **Shader程序**:OpenGL ES 2.0及更高版本支持自定义着色器,这在Cocos2dx中得到充分利用。我们可以编写顶点和片段着色器,以计算水波纹的位移和颜色变化。顶点着色器处理位置信息,片段着色器则处理颜色和透明度...

    cocos2dx斗地主服务端,客户端在我的资源列表中

    在游戏开发领域,Cocos2dx是一款广泛使用的开源游戏引擎,它基于C++,并提供了对多种平台的支持,包括iOS。本资源包含了斗地主游戏的服务端和客户端代码,这为我们提供了一个深入理解如何构建一款跨平台游戏的机会。...

    cocos2dx教程

    - 打开`cocos2d-x/cocos2d-win32.vs2008.sln`解决方案,在Visual Studio中创建新的cocos2d-win32应用项目,如"Cocos2dxSimpleGame"。 - 确保不勾选Box2D(若项目不需要物理引擎),但选择"SimpleAudioEngine in ...

    cocos2dx 游戏开发系列之三 源码

    在游戏开发领域,cocos2dx是一个广泛使用的开源游戏引擎,尤其在跨平台开发中扮演着重要角色。本篇将深入探讨cocos2dx游戏开发系列的第三部分——源码解析和Android工程的创建与迁移。 首先,cocos2dx是基于C++的,...

    cocos2dx可用3d粒子编辑器

    cocos2dx可用3d粒子编辑器,支持pc、mac、iphone、android等平台

    cocos2dx 2048

    包括图形渲染、物理引擎、事件处理、资源管理以及游戏逻辑等,对于想要学习游戏开发的程序员来说,这是一个很好的实践项目,可以深入理解cocos2dx框架及其在实际项目中的应用。在“Classes”目录下,通常包含游戏的...

    cocos2dx单机大富翁游戏源码

    “cocos2dx单机大富翁游戏源码”是一个基于cocos2dx框架开发的休闲娱乐游戏项目,旨在为开发者提供一个学习和参考的实例,帮助他们理解和掌握cocos2dx引擎在实际游戏开发中的应用。下面,我们将深入探讨cocos2dx框架...

    COCOS2DX实现线程后台运作与推送

    在iOS开发中,COCOS2DX是一款广泛使用的2D游戏开发框架,它基于C++,为开发者提供了高效的游戏开发工具。本主题聚焦于如何利用COCOS2DX实现线程后台运作以及推送通知功能,特别是在用户按下HOME键后进入后台模式时。...

    cocos2dx 超级玛丽 demo 源码

    【cocos2dx 超级玛丽 demo 源码】是基于cocos2dx游戏引擎开发的一个经典游戏“超级玛丽”的示例项目。cocos2dx是一个开源的游戏开发框架,它采用C++编写,同时支持iOS、Android等多个平台,为开发者提供了高效且便捷...

Global site tag (gtag.js) - Google Analytics