Android Studio运行GitHub项目触发ExceptionInInitializerError崩溃求解决
从你提供的Logcat日志可以明确,崩溃的核心原因是应用找不到32位的libgdx.so原生库,进而触发了ExceptionInInitializerError和UnsatisfiedLinkError。下面是针对这个问题的分步解决方案:
首先贴出你的错误日志以便参考:
FATAL EXCEPTION: main Process: com.gamestudio24.cityescape.android, PID: 29666 java.lang.ExceptionInInitializerError at java.lang.Class.newInstance(Native Method) at android.app.Instrumentation.newActivity(Instrumentation.java:1090) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5443) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load shared library 'gdx' for target: Linux, 32-bit at com.badlogic.gdx.utils.SharedLibraryLoader.load(SharedLibraryLoader.java:115) at com.badlogic.gdx.utils.GdxNativesLoader.load(GdxNativesLoader.java:34) at com.badlogic.gdx.backends.android.AndroidApplication.<clinit>(AndroidApplication.java:59) ... 11 more Caused by: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.gamestudio24.cityescape.android-1/base.apk"],nativeLibraryDirectories=[/data/app/com.gamestudio24.cityescape.android-1/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libgdx.so" at java.lang.Runtime.loadLibrary(Runtime.java:367) at java.lang.System.loadLibrary(System.java:1076) at com.badlogic.gdx.utils.SharedLibraryLoader.load(SharedLibraryLoader.java:111) ... 13 more
具体解决方案
1. 检查Gradle中的ABI过滤配置
你的设备是32位架构(日志显示Linux, 32-bit),需要确保Gradle配置中包含对应的32位ABI。打开模块级的build.gradle文件,在defaultConfig块中添加或修改ndk.abiFilters:
android { defaultConfig { // 保留其他原有配置 ndk { // 包含常用的32位架构,按需调整 abiFilters 'armeabi-v7a', 'x86', 'armeabi' } } }
如果之前只配置了64位架构(比如arm64-v8a),32位设备就无法找到匹配的库,必须加入32位ABI选项。
2. 确认libgdx依赖正确引入
确保在模块级build.gradle的dependencies块中,正确添加了libgdx核心库和对应架构的原生依赖:
dependencies { // 替换$gdxVersion为你实际使用的libgdx版本,比如1.12.1 implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" implementation "com.badlogicgames.gdx:gdx:$gdxVersion" // 添加32位架构的原生依赖 natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" }
如果缺少对应架构的natives依赖,打包时就不会将libgdx.so包含到APK中。
3. 清理缓存并重建项目
缓存问题可能导致库没有正确打包,执行以下操作:
- 在Android Studio中点击
Build > Clean Project - 接着点击
Build > Rebuild Project - 也可以手动删除项目根目录和模块目录下的
build文件夹,然后重新构建
4. 验证APK中的原生库是否存在
通过Android Studio的Build > Analyze APK功能打开生成的APK,查看lib目录下是否存在对应架构的文件夹(比如armeabi-v7a),并且该文件夹内有libgdx.so文件。如果不存在,说明依赖没有正确被打包,需要回到步骤2检查配置。
5. 确认设备架构兼容性
如果你的测试设备是64位的,理论上应该兼容32位库,但如果Gradle配置只打包了64位库,就会出现问题。此时需要同时添加32位和64位的ABI过滤,确保覆盖所有需要支持的设备。
内容的提问来源于stack exchange,提问作者Nirmal Prajapat

