Android应用加载ArcGIS地图时崩溃问题求助
解决ArcGIS Runtime SDK for Android加载地图时的NoClassDefFoundError崩溃问题
问题场景
开发Android应用加载ArcGIS Online地图,启动后地图加载阶段随即崩溃,核心报错为NoClassDefFoundError: org.apache.hc.core5.http.message.BasicNameValuePair。
MainActivity代码
public class MainActivity extends AppCompatActivity { private MapView mMapView; private ArcGISMap wenceMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Get a reference to the MapView in your layout file mMapView = findViewById(R.id.mapView); wenceMap = new ArcGISMap(Basemap.Type.OPEN_STREET_MAP,0.47867,37.803972, 7 ); mMapView.setMap(wenceMap); } @Override protected void onPause() { mMapView.pause(); super.onPause(); } @Override protected void onResume() { super.onResume(); mMapView.resume(); } @Override protected void onDestroy() { super.onDestroy(); mMapView.dispose(); } }
崩溃日志
2023-03-06 16:28:43.751 5916-5950/com.example.connectdb A/ample.connectd: runtime.cc:663] JNI DETECTED ERROR IN APPLICATION: JNI NewLocalRef called with pending exception java.lang.NoClassDefFoundError: com.esri.arcgisruntime.internal.io.handler.request.r runtime.cc:663] at void com.esri.arcgisruntime.internal.requestable.a$b.a(boolean) (SourceFile:42) runtime.cc:663] at void com.esri.arcgisruntime.internal.requestable.a.a(com.esri.arcgisruntime.internal.jni.CoreRequest, com.esri.arcgisruntime.io.RemoteResource) (SourceFile:6) runtime.cc:663] at void com.esri.arcgisruntime.layers.ServiceImageTiledLayer.onRequestRequired(com.esri.arcgisruntime.internal.jni.CoreRequest) (SourceFile:1) runtime.cc:663] at void com.esri.arcgisruntime.layers.Layer.a(com.esri.arcgisruntime.internal.jni.CoreRequest) (SourceFile:5) runtime.cc:663] at void com.esri.arcgisruntime.layers.Layer.$r8$lambda$PYL96yarVXNzWqZ_E_istxaJo94(com.esri.arcgisruntime.layers.Layer, com.esri.arcgisruntime.internal.jni.CoreRequest) (SourceFile:-1) runtime.cc:663] at void com.esri.arcgisruntime.layers.Layer$$ExternalSyntheticLambda0.a(com.esri.arcgisruntime.internal.jni.CoreRequest) (D8$$SyntheticClass:-1) runtime.cc:663] at void com.esri.arcgisruntime.internal.jni.CoreLayer.onRequestRequired(long) (SourceFile:5) runtime.cc:663] Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/hc/core5/http/message/BasicNameValuePair; runtime.cc:663] at void com.esri.arcgisruntime.internal.io.handler.request.c.<clinit>() (SourceFile:1) runtime.cc:663] at void com.esri.arcgisruntime.internal.requestable.a$b.a(boolean) (SourceFile:42) runtime.cc:663] at void com.esri.arcgisruntime.internal.requestable.a.a(com.esri.arcgisruntime.internal.jni.CoreRequest, com.esri.arcgisruntime.io.RemoteResource) (SourceFile:6) runtime.cc:663] at void com.esri.arcgisruntime.layers.ServiceImageTiledLayer.onRequestRequired(com.esri.arcgisruntime.internal.jni.CoreRequest) (SourceFile:1) runtime.cc:663] at void com.esri.arcgisruntime.layers.Layer.a(com.esri.arcgisruntime.internal.jni.CoreRequest) (SourceFile:5) runtime.cc:663] at void com.esri.arcgisruntime.layers.Layer.$r8$lambda$PYL96yarVXNzWqZ_E_istxaJo94(com.esri.arcgisruntime.layers.Layer, com.esri.arcgisruntime.internal.jni.CoreRequest) (SourceFile:-1) runtime.cc:663] at void com.esri.arcgisruntime.layers.Layer$$ExternalSyntheticLambda0.a(com.esri.arcgisruntime.internal.jni.CoreRequest) (D8$$SyntheticClass:-1) runtime.cc:663] at void com.esri.arcgisruntime.internal.jni.CoreLayer.onRequestRequired(long) (SourceFile:5) runtime.cc:663] Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.hc.core5.http.message.BasicNameValuePair" on path: DexPathList[[dex file "/data/data/com.example.connectdb/code_cache/.overlay/base.apk/classes3.dex", zip file "/data/app/~~xFM4OE_RLEEB6OQ3KBuvcw==/com.example.connectdb-XpS3GPmm3IYAnKjd-2utlw==/base.apk"],nativeLibraryDirectories=[/data/app/~~xFM4OE_RLEEB6OQ3KBuvcw==/com.example.connectdb-XpS3GPmm3IYAnKjd-2utlw==/lib/x86, /data/app/~~xFM4OE_RLEEB6OQ3KBuvcw==/com.example.connectdb-XpS3GPmm3IYAnKjd-2utlw==/base.apk!/lib/x86, /system/lib, /system_ext/lib]] runtime.cc:663] at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:207) runtime.cc:663] at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379) runtime.cc:663] at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) runtime.cc:663] at void com.esri.arcgisruntime.internal.io.handler.request.c.<clinit>() (SourceFile:1) runtime.cc:663] at void com.esri.arcgisruntime.internal.requestable.a$b.a(boolean) (SourceFile:42) runtime.cc:663] at void com.esri.arcgisruntime.internal.requestable.a.a(com.esri.arcgisruntime.internal.jni.CoreRequest, com.esri.arcgisruntime.io.RemoteResource) (SourceFile:6) runtime.cc:663] at void com.esri.arcgisruntime.layers.ServiceImageTiledLayer.onRequestRequired(com.esri.arcgisruntime.internal.jni.CoreRequest) (SourceFile:1) 2023-03-06 16:28:43.751 5916-5950/com.example.connectdb A/ample.connectd: runtime.cc:663] at void com.esri.arcgisruntime.layers.Layer.a(com.esri.arcgisruntime.internal.jni.CoreRequest) (SourceFile:5) runtime.cc:663] at void com.esri.arcgisruntime.layers.Layer.$r8$lambda$PYL96yarVXNzWqZ_E_istxaJo94(com.esri.arcgisruntime.layers.Layer, com.esri.arcgisruntime.internal.jni.CoreRequest) (SourceFile:-1) runtime.cc:663] at void com.esri.arcgisruntime.layers.Layer$$ExternalSyntheticLambda0.a(com.esri.arcgisruntime.internal.jni.CoreRequest) (D8$$SyntheticClass:-1) runtime.cc:663] at void com.esri.arcgisruntime.internal.jni.CoreLayer.onRequestRequired(long) (SourceFile:5) runtime.cc:663] runtime.cc:663] in call to NewLocalRef 2023-03-06 16:28:43.751 5916-5950/com.example.connectdb A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 5950 (RTC thread), pid 5916 (ample.connectdb)
当前Gradle配置
手动引入ArcGIS SDK的配置:
implementation files('libs/arcgis-runtime-sdk-java-200.0.0/libs/arcgis-android-100.15.1.aar')
其他依赖:
implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.navigation:navigation-fragment:2.5.3' implementation 'androidx.navigation:navigation-ui:2.5.3' testImplementation 'junit:junit:4.13.2' implementation 'org.apache.httpcomponents:httpcore:4.4.14' //implementation "com.esri.arcgisruntime:arcgis-java:100.15.1" runtimeOnly "org.slf4j:slf4j-nop:1.7.32" implementation files('libs/volley-1.2.1.aar')
解决方案
1. 补充正确的Apache HttpClient 5依赖
报错缺失的org.apache.hc.core5.http.message.BasicNameValuePair属于Apache HttpClient 5.x版本,当前引入的httpcore:4.4.14是4.x版本,两者不兼容。需添加5.x系列的依赖:
implementation 'org.apache.httpcomponents.client5:httpclient5:5.2.1' implementation 'org.apache.httpcomponents.core5:httpcore5:5.2.1'
2. 清理并重建项目
添加依赖后执行以下操作:
- 点击Android Studio的
Build->Clean Project - 再点击
Build->Rebuild Project - 重启Android Studio后重新运行应用
3. 排查Dex分包问题(可选)
如果仍出现类找不到的情况,可能是Dex分包导致的,在build.gradle(Module)中启用Dex分包:
android { defaultConfig { multiDexEnabled true } }
同时添加MultiDex依赖:
implementation 'androidx.multidex:multidex:2.0.1'
并让MainActivity继承MultiDexAppCompatActivity,或在自定义Application类中初始化MultiDex。
内容的提问来源于stack exchange,提问作者MrDoctor
相关产品推荐
相关产品推荐

