2015-02-23 58 views
7

错误发生在正在运行的应用中的设备:UnsatisfiedLinkError(com.esri.core.runtime.LicenseImpl.nativeIsClientIdValid)

java.lang.UnsatisfiedLinkError: Native method not found: com.esri.core.runtime.LicenseImpl.nativeIsClientIdValid:(Ljava/lang/String;)Z 
     at com.esri.core.runtime.LicenseImpl.nativeIsClientIdValid(Native Method) 
     at com.esri.core.runtime.LicenseImpl.a(Unknown Source) 
     at com.esri.android.a.b.b(Unknown Source) 

相关代码:

import com.esri.android.runtime.ArcGISRuntime; 

public class MainActivity extends FragmentActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ArcGISRuntime.setClientId("xxxxxxxxxxxxxxxx"); 

...... 

的build.gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 19 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "xxx.xxxx.xxxxx" 
     minSdkVersion 17 
     targetSdkVersion 19 
     versionCode 1 
     versionName "1.0" 
     renderscriptTargetApi 19 
     renderscriptSupportModeEnabled true 
    } 

    packagingOptions { 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/LGPL2.1' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/NOTICE' 
    } 

    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
      applicationVariants.all { variant -> 
       variant.outputs.each { output -> 
        output.outputFile = new File(output.outputFile.parent, "xxxx-release.apk") 
       } 
      } 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:support-v4:21.0.3' 
    compile 'com.google.android.gms:play-services:6.5.87' 
} 

proguard-rules.txt:

-keep class android.view.** { *; } 
-keep class com.esri.** { *; } 
-keep class javax.servlet.** { *; } 
-keep class jcifs.http.** { *; } 
-keep class org.apache.http.** { *; } 
-keep class org.joda.time.** { *; } 
-keep class org.w3c.dom.bootstrap.** { *; } 
-keep class org.xmlpull.v1.** { *; } 

-dontwarn javax.servlet.** 
-dontwarn jcifs.http.** 
-dontwarn org.apache.http.** 
-dontwarn org.joda.time.** 
-dontwarn org.w3c.dom.bootstrap.** 
-dontwarn org.xmlpull.v1.** 

的logcat:

03-04 18:06:19.213 13255-13255/xxx.xxxx.xxxxx D/dalvikvm﹕ GC_FOR_ALLOC freed 360K, 17% free 35228K/42136K, paused 17ms, total 17ms 
03-04 18:06:19.283 13255-13255/xxx.xxxx.xxxxx D/dalvikvm﹕ GC_FOR_ALLOC freed 368K, 16% free 35516K/42136K, paused 14ms, total 14ms 
03-04 18:06:19.343 13255-13753/xxx.xxxx.xxxxx D/dalvikvm﹕ GC_FOR_ALLOC freed 408K, 15% free 35859K/42136K, paused 14ms, total 14ms 
03-04 18:06:19.353 13255-13753/xxx.xxxx.xxxxx W/dalvikvm﹕ Failed processing annotation value 
03-04 18:06:19.353 13255-13753/xxx.xxxx.xxxxx W/dalvikvm﹕ Exception Ljava/lang/NoSuchFieldError; thrown while initializing Lorg/b/a/d/e/z; 
03-04 18:06:19.353 13255-13753/xxx.xxxx.xxxxx W/dalvikvm﹕ Exception Ljava/lang/NoSuchFieldError; thrown while initializing Lorg/b/a/d/an; 
03-04 18:06:19.353 13255-13753/xxx.xxxx.xxxxx W/dalvikvm﹕ Exception Ljava/lang/NoSuchFieldError; thrown while initializing Lcom/esri/core/internal/util/d; 
03-04 18:06:19.353 13255-13754/xxx.xxxx.xxxxx I/dalvikvm﹕ Rejecting re-init on previously-failed class Lcom/esri/core/internal/util/d; v=0x0 
03-04 18:06:19.423 13255-13255/xxx.xxxx.xxxxx D/dalvikvm﹕ GC_FOR_ALLOC freed 776K, 15% free 35950K/42136K, paused 14ms, total 14ms 
03-04 18:06:19.443 13255-13756/xxx.xxxx.xxxxx I/dalvikvm﹕ Rejecting re-init on previously-failed class Lcom/esri/core/internal/util/d; v=0x0 
03-04 18:06:19.453 13255-13755/xxx.xxxx.xxxxx I/dalvikvm﹕ Rejecting re-init on previously-failed class Lcom/esri/core/internal/util/d; v=0x0 

我使用:Android的工作室1.0.2和ArcGIS SDK 9.2.5

有,如果应用程序是由Android Studio中运行没有问题。如果应用程序在APK中生成,安装在设备中,然后运行,则会发生错误。

有没有解决方法?

非常感谢!

Similar question答案不起作用。

+0

请发布您的代码(包括本地代码) – 2015-02-27 11:08:18

+0

我得到了同样的错误当我使用SONIC-NDK。此错误发生时,如此丢失文件.. – user 2015-03-01 16:59:17

+0

相关代码包括在内。 – kel 2015-03-02 06:03:09

回答

2

您的问题与ProGuard有关。当您以释放模式部署应用程序时,ProGuard会启动并缩小所有的方法/类/变量/等。这意味着如果一种方法曾被称为“doSomething()”,它将被重命名为“a()”之类的内容。这很好,因为当所有的代码发生这种情况时,它会使代码变得更小更快。

这可能是与NDK的工作出了问题,因为本机库和Java方法的通信方式是通过反射,这需要命名的一致性(方法是通过文本名称找到。如果名称的变化,该方法不能找到)。

您可以通过编辑ProGuard文件来排除某些类别,以解决此问题。

例如,在你的情况,我想补充下面一行在你的ProGuard文件:

-keep class com.esri.core.runtime.LicenseImpl { *; } 

其实,你可以让这条规则更加具体,只排除问题的方法:

-keep class com.esri.core.runtime.LicenseImpl { 
    public void nativeIsClientIdValid(...); 
} 

ProGuard的是非常强大的,当谈到决定哪些代码的部分精缩与否,所以我建议reading up on it.

可能还有其他类需要以类似的方式从ProGuard中排除,因此如果在添加此修复程序后继续出现类似错误,则只需添加更多ProGuard规则,具体取决于哪些方法/类未找到。

编辑:

根据你得到新的错误,似乎是proguard的重构注释,这可能有可能是你的新错误的原因。添加下面的标记来排除注释:

-keepattributes *Annotation* 

编辑2:

this blog about migrating projects to Android studio in the Esri website,他们似乎还没有找到一种方法来克服ProGuard的问题本身,因为他们建议设置enableMinifyfalse。这可能意味着Esri包在这个时候根本不用缩小规模,或者他们没有花时间去搞清楚如何解决问题。

+0

谢谢。 proguard-rules.txt包含在问题中。该应用程序现在无法查看地图。它只是显示一个黑色区域。 Logcat也包括在内。它与NoSuchFieldError有关吗? – kel 2015-03-04 10:13:35

+0

它看起来有一个注释问题。请参阅我的编辑。 – 2015-03-04 10:32:11

+0

添加行“-keepattributes * Annotation *”后,发生同样的错误。感谢博客链接,我同意esri可能不支持proguard。所以......也许我必须放弃并将“minifyEnabled”设置为“false”...... – kel 2015-03-05 08:48:30

1

将此添加到您的proguard文件中。这不适混淆到库

-keep class com.esri.** { *; } 
-keep interface com.esri.** { *; } 
+0

在这种情况下它不起作用。 – kel 2015-03-05 08:31:27

1
-keep class com.esri.** { *; } 
-keep interface com.esri.** { *; } 
-keep class org.codehaus.jackson.** { *; } 
-dontwarn org.codehaus.jackson.map.ext.** 
-dontwarn jcifs.http.** 

为我工作。

+0

非常感谢!你救了我的命!自从几天以来我一直在努力!最后你的解决方案工作 – priyanka 2016-01-14 13:04:22

0

我有同样的问题,并解决了this link on Esri GeoNet解释。

基于什么EsriStaff写道:

是的,我认为这是最有可能发生的事情。我可以在上面的路径中看到,涉及到arm64路径,并且上面有一个注释,表示事情工作正常,直到添加了另一个依赖项。鉴于这两点,你很可能会遇到这样的问题:一旦Android加载了64位本地库,它不再加载32位库。 [...] ArcGIS Runtime SDK提供32位的armeabi-v7a库,它通常在运行64位时加载,因为它的向前兼容性,这可以解释为什么在找到更好的依赖之前找到了正确的东西。

如EsriGeoNet链接的SO question建议的解决方案是增加这个你app.gradle文件中:

android { 
    .... 
    defaultConfig { 
     .... 
     ndk { 
      abiFilters "armeabi", "armeabi-v7a", "x86", "mips" 
     } 
    } 
} 

此时运行gradle这个构建应该给你一个NDK弃用集成的错误,你可以通过添加此您gradle.properties(全球性)内解决文件:

android.useDeprecatedNdk = true 

我在三星S6测试了Android 6.0.1,并能正常工作。

除此之外,我发现该问题已经存在于ArcGis Android SDK v10.2.3中,升级到最新的v10.2.8.1并未解决问题。

下周我们的工作人员会与Esri意大利办事处安排会议,我会询问有关此错误的详细信息以及是否/何时将要修复。

希望这可以帮助你和任何其他人有这个问题。