cocos2d / cocos2d-x

Cocos2d-x is a suite of open-source, cross-platform, game-development tools utilized by millions of developers across the globe. Its core has evolved to serve as the foundation for Cocos Creator 1.x & 2.x.

Home Page:https://www.cocos.com/en/cocos2d-x

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Bug: JNI DETECTED ERROR IN APPLICATION: JNI NewStringUTF called with pending exception java.lang.NumberFormatException: Invalid int: ""

solodon4 opened this issue · comments

  • cocos2d-x version: 3.17 and 4.0
  • devices test on: Alcatel OneTouch
  • developing environments
    • NDK version: 21.4.7075529

When running code on Android, I hit JNI error mentioned in the subject, which also dumps the stack of the unhandled exception:

 A/art: art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: JNI NewStringUTF called with pending exception java.lang.NumberFormatException: Invalid int: ""
 A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.NumberFormatException java.lang.Integer.invalidInt(java.lang.String) (Integer.java:138)
 A/art: art/runtime/java_vm_ext.cc:410]   at int java.lang.Integer.parseInt(java.lang.String, int) (Integer.java:358)
 A/art: art/runtime/java_vm_ext.cc:410]   at int java.lang.Integer.parseInt(java.lang.String) (Integer.java:334)
 A/art: art/runtime/java_vm_ext.cc:410]   at int org.cocos2dx.lib.Cocos2dxHelper.getIntegerForKey(java.lang.String, int) (Cocos2dxHelper.java:567)
 A/art: art/runtime/java_vm_ext.cc:410]   at void org.cocos2dx.lib.Cocos2dxRenderer.nativeTouchesEnd(int, float, float) (Cocos2dxRenderer.java:-2)
 A/art: art/runtime/java_vm_ext.cc:410]   at void org.cocos2dx.lib.Cocos2dxRenderer.handleActionUp(int, float, float) (Cocos2dxRenderer.java:131)
 A/art: art/runtime/java_vm_ext.cc:410]   at void org.cocos2dx.lib.Cocos2dxGLSurfaceView$10.run() (Cocos2dxGLSurfaceView.java:312)
 A/art: art/runtime/java_vm_ext.cc:410]   at void android.opengl.GLSurfaceView$GLThread.guardedRun() (GLSurfaceView.java:1463)
 A/art: art/runtime/java_vm_ext.cc:410]   at void android.opengl.GLSurfaceView$GLThread.run() (GLSurfaceView.java:1240)
 A/art: art/runtime/java_vm_ext.cc:410] 
 A/art: art/runtime/java_vm_ext.cc:410]     in call to NewStringUTF
 A/art: art/runtime/java_vm_ext.cc:410]     from void org.cocos2dx.lib.Cocos2dxRenderer.nativeTouchesEnd(int, float, float)
 A/art: art/runtime/java_vm_ext.cc:410] "GLThread 7358" prio=5 tid=31 Runnable
 A/art: art/runtime/java_vm_ext.cc:410]   | group="main" sCount=0 dsCount=0 obj=0x1318c880 self=0xb93b4290
 A/art: art/runtime/java_vm_ext.cc:410]   | sysTid=16532 nice=0 cgrp=default sched=0/0 handle=0x9e923930
 A/art: art/runtime/java_vm_ext.cc:410]   | state=R schedstat=( 87583288690 17860653996 88705 ) utm=7998 stm=760 core=1 HZ=100
 A/art: art/runtime/java_vm_ext.cc:410]   | stack=0x9e821000-0x9e823000 stackSize=1038KB
 A/art: art/runtime/java_vm_ext.cc:410]   | held mutexes= "mutator lock"(shared held)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #00 pc 0035a447  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiPKcPNS_9ArtMethodEPv+126)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #01 pc 0033afcf  /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+138)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #02 pc 0024de43  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+750)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #03 pc 0024e4e7  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortVEPKcS2_St9__va_list+54)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #04 pc 000fbcbd  /system/lib/libart.so (_ZN3art11ScopedCheck6AbortFEPKcz+28)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #05 pc 00100ac3  /system/lib/libart.so (_ZN3art11ScopedCheck5CheckERNS_18ScopedObjectAccessEbPKcPNS_12JniValueTypeE.constprop.95+4894)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #06 pc 0010820b  /system/lib/libart.so (_ZN3art8CheckJNI12NewStringUTFEP7_JNIEnvPKc+366)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #07 pc 00fef671  /data/app/com.example.app.android-2/lib/arm/libMyGame.so (_Z11_getClassIDPKc+28)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #08 pc 00fefa95  /data/app/com.example.app.android-2/lib/arm/libMyGame.so (_ZN7cocos2d9JniHelper19getStaticMethodInfoERNS_14JniMethodInfo_EPKcS4_S4_+40)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #09 pc 00feae05  /data/app/com.example.app.android-2/lib/arm/libMyGame.so (_ZN7cocos2d8BitmapDC29getBitmapFromJavaShadowStrokeEPKciiNS_6Device9TextAlignERKNS_14FontDefinitionE+36)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #10 pc 00fead5b  /data/app/com.example.app.android-2/lib/arm/libMyGame.so (_ZN7cocos2d6Device21getTextureDataForTextEPKcRKNS_14FontDefinitionENS0_9TextAlignERiS7_Rb+62)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #11 pc 01145234  /data/app/com.example.app.android-2/lib/arm/libMyGame.so (_ZN7cocos2d9Texture2D14initWithStringEPKcRKNS_14FontDefinitionE+324)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #12 pc 0103d174  /data/app/com.example.app.android-2/lib/arm/libMyGame.so (_ZN7cocos2d5Label25createSpriteForSystemFontERKNS_14FontDefinitionE+96)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #13 pc 0103d7bc  /data/app/com.example.app.android-2/lib/arm/libMyGame.so (_ZN7cocos2d5Label13updateContentEv+428)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #14 pc 0103f518  /data/app/com.example.app.android-2/lib/arm/libMyGame.so (_ZNK7cocos2d5Label14getContentSizeEv+44)
 A/art: art/runtime/java_vm_ext.cc:410]   native: #15 pc 0141e754  /data/app/com.example.app.android-2/lib/arm/libMyGame.so (_ZN7cocos2d2ui4Text9setStringERKNSt6__ndk112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE+212)

If you look at the code in this frame: org.cocos2dx.lib.Cocos2dxHelper.getIntegerForKey(java.lang.String, int) (Cocos2dxHelper.java:567) you will see you have a call to Integer.parseInt, which can throw NumberFormatException according to its documentation, performed inside an exception handler:

    public static int getIntegerForKey(String key, int defaultValue) {
        SharedPreferences settings = sActivity.getSharedPreferences(Cocos2dxHelper.PREFS_NAME, 0);
        try {
            return settings.getInt(key, defaultValue);
        }
        catch (Exception ex) {
            ex.printStackTrace();

            Map allValues = settings.getAll();
            Object value = allValues.get(key);
            if ( value instanceof String) {
                return  Integer.parseInt(value.toString()); // <<<<<<<< THIS THROWS EXCEPTION
            }
            else if (value instanceof Float)
            {
                return ((Float) value).intValue();
            }
            else if (value instanceof Boolean)
            {
                boolean booleanValue = ((Boolean) value).booleanValue();
                if (booleanValue)
                    return 1;
            }
        }

        return defaultValue;
    }

There are multiple occurrences of parse methods called within exception handler in that file alone and they all need to be wrapped into a try -catch block or replaced with a call to a function doing so.