不公正的链接错误
设备中运行应用时发生错误:
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中生成,安装在设备中,然后运行,则会发生错误。
有没有解决方法?
非常感谢你!
类似的问题答案不起作用。
您的问题与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在决定哪部分代码被缩小时非常强大,因此我建议您阅读它。
可能还有其他类需要以类似的方式从ProGuard中排除,因此如果在添加此修复程序后继续出现类似错误,则只需添加更多ProGuard规则,具体取决于哪些方法/类未找到。
编辑:
根据你得到的新错误,似乎proguard是重构注释,这可能是你新错误的原因。 添加以下标志以排除注释:
-keepattributes *Annotation*
编辑2:
根据这篇关于将项目迁移到Esri网站上的Android工作室的博客,似乎他们尚未找到解决ProGuard问题的方法,因为他们建议将enableMinify
设置为false
。 这可能意味着Esri包在这个时候根本不用缩小规模,或者他们没有花时间去搞清楚如何解决问题。
将此添加到您的proguard文件中。 这不会对你的图书馆造成混淆
-keep class com.esri.** { *; }
-keep interface com.esri.** { *; }
-keep class com.esri.** { *; }
-keep interface com.esri.** { *; }
-keep class org.codehaus.jackson.** { *; }
-dontwarn org.codehaus.jackson.map.ext.**
-dontwarn jcifs.http.**
为我工作。
链接地址: http://www.djcxy.com/p/83877.html上一篇: UnsatisfiedLinkError (com.esri.core.runtime.LicenseImpl.nativeIsClientIdValid)
下一篇: How to remove repeatable keys, key preview of the Android custom keyboard