2015-02-23 3 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 Studio 1.0.2 и ArcGIS SDK 10.2.5

Там нет никаких проблем, если приложение работает под управлением Android Studio. Ошибка при создании приложения в APK, установке в устройство и последующем запуске.

Есть ли решение?

спасибо!

Similar question Ответ не работает.

+0

Пожалуйста, разместите свой код (включая собственный код) –

+0

У меня такая же ошибка. Когда я пользуюсь SONIC-NDK. Эта ошибка возникает, когда файл отсутствует. – user

+0

связанный код включен. – kel

ответ

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, в зависимости от того, какие методы/классы не найдены.

Edit:

Согласно новой ошибке вы получаете, кажется ProGuard является рефакторинг аннотаций, и это, вероятно, может быть причиной вашей новой ошибки.Добавьте следующий флаг исключить аннотации:

-keepattributes *Annotation* 

Edit 2:

По this blog about migrating projects to Android studio in the Esri website, кажется, что они еще не нашли способ преодолеть ProGuard выдает себя, как они рекомендуют установить enableMinify до false. Это может означать либо то, что пакет Esri просто не работает с минимализацией в настоящее время, либо что они не вложили времени в выяснение того, как решить проблему.

+0

Спасибо. proguard-rules.txt включен в вопрос. Теперь приложение не может просматривать карту. Он просто показывает черную область. Logcat также включен. Связано ли это с NoSuchFieldError? – kel

+0

Похоже, что есть проблема с аннотациями. См. Мое редактирование. –

+0

После добавления строки «-keepattributes * Annotation *» произошла ошибка. Спасибо за ссылку в блоге, я согласен с тем, что esri может не поддерживать proguard. Итак ... может быть, мне нужно отказаться и установить «minifyEnabled» на «false» ... – kel

1

Добавьте это в свой файл proguard. Это не будет применять запутывания в библиотеку

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

В этом случае это не работает. – kel

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

0

У меня была такая же проблема и решена, как описано в this link on Esri GeoNet.

Основываясь на том, что написал EsriStaff:

Да, я согласен, что это, скорее всего, что происходит. Я вижу на пути выше, что задействованы пути arm64, а также был комментарий выше, что все работает нормально, пока не будет добавлена ​​другая зависимость. Учитывая эти два момента, очень возможно, что вы столкнулись с проблемой, когда однажды Android загрузил 64-битную собственную библиотеку, она больше не загружает 32-разрядные библиотеки. [...] SDK ArcGIS Runtime SDK предоставляет 32-разрядную библиотеку armeabi-v7a, которая обычно загружается при работе на 64-битной основе, как ее совместимая с переходом, которая объясняет, почему вы находите вещи до тех пор, пока не добавите больше зависимостей.

Как SO question связаны в EsriGeoNet предлагает решение, чтобы добавить это внутри app.gradle файла:

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

На этом этапе запуска Gradle сборки должна дать вам NDK устаревшее ошибки интеграции, что вам может решить, добавив это в ваших gradle.properties (Глобальные свойства) файл:

android.useDeprecatedNdk = true 

Я проверил на Samsung S6 с Android 6.0.1 и работает отлично.

В дополнение к этому я узнал, что проблема уже была в ArcGis Android SDK v10.2.3, и что обновление до последнего v10.2.8.1 не устраняет проблему.

На следующей неделе у нашего персонала запланирована встреча с итальянским офисом в Эсри, и я спрошу подробности об этой ошибке, и если/когда она будет исправлена.

Надеюсь, это поможет вам и всем, у кого есть эта проблема.