2015-02-23 56 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意大利辦事處安排會議,我會詢問有關此錯誤的詳細信息以及是否/何時將要修復。

希望這可以幫助你和任何其他人有這個問題。