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.