You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:42:05