2016-11-18 10 views
1

Я создал очень минимальное приложение, просто показывая «Hello World». Основное действие вызывает вызов для загрузки библиотек SQLCipher.
Android-приложение падает с UnsatisfiedLinkError при использовании SQLCipher и Crashlytics для x86_64 и arm84_v8a

package companydomain.myapplication; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import net.sqlcipher.database.SQLiteDatabase; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     SQLiteDatabase.loadLibs(this);   // loading the SQLCipher libraries 
    } 
} 


build.gradle (модуль: приложение) является:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion '25.0.0' 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 25 
    } 
    return void 
} 

dependencies { 
    compile 'com.android.support:appcompat-v7:25.0.1' 
    compile 'net.zetetic:android-database-sqlcipher:[email protected]' 
} 


Это приложение работает как задумано.
Однако, когда я добавить Crashlytics к build.gradle:

buildscript { 
    repositories { 
     maven { url 'https://maven.fabric.io/public' } 
    } 
    dependencies { 
     classpath 'io.fabric.tools:gradle:1.+' 
    } 
} 

apply plugin: 'com.android.application' 
apply plugin: 'io.fabric' 

repositories { 
    maven { url 'https://maven.fabric.io/public' } 
} 

android { 
    compileSdkVersion 25 
    buildToolsVersion '25.0.0' 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 25 
    } 
    return void 
} 

dependencies { 
    compile 'com.android.support:appcompat-v7:25.0.1' 
    compile 'net.zetetic:android-database-sqlcipher:[email protected]' 

    compile('com.crashlytics.sdk.android:crashlytics:[email protected]') { 
     transitive = true; 
    } 
    compile('com.crashlytics.sdk.android:crashlytics-ndk:[email protected]') { 
     transitive = true; 
    } 
} 

crashlytics { 
    enableNdk true 
    androidNdkOut 'src/main/obj' 
    androidNdkLibsOut 'src/main/libs' 
} 


после запуска приложения аварии с ошибкой «java.lang.UnsatisfiedLinkError ... не смог найти "libsqlcipher.so" - Я даже не сделать вызов Crashlytics от моей деятельности.

    --------- beginning of crash 
E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: companydomain.myapplication, PID: 2887 
       java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/companydomain.myapplication-2/base.apk"],nativeLibraryDirectories=[/data/app/companydomain.myapplication-2/lib/x86_64, /vendor/lib64, /system/lib64]]] couldn't find "libsqlcipher.so" 
        at java.lang.Runtime.loadLibrary(Runtime.java:366) 
        at java.lang.System.loadLibrary(System.java:989) 
        at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:196) 
        at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:189) 
        at companydomain.myapplication.MainActivity.onCreate(MainActivity.java:21) 
        at android.app.Activity.performCreate(Activity.java:5937) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
        at android.app.ActivityThread.access$800(ActivityThread.java:144) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5221) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 


Это происходит только для x86_64 и arm64_v8a АБИС. В последнем случае список ошибок содержит «arm64_v8a» вместо «x86_64»

Любая идея, что не так?
Спасибо заранее,
Gerhard

ответ

6

нашел ответ сам.

SQLCipher, очевидно, не поддерживает 64-битную архитектуру.
Так в build.gradle я добавил abiFilter-заявление об исключении 64-разрядных архитектур:

... 
android { 
    compileSdkVersion 25 
    buildToolsVersion '25.0.0' 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 25 

     ndk { 
      abiFilters "armeabi", "armeabi-v7a", "x86", "mips" 
     } 
    } 
    return void 
} 
.... 


не падает больше!

2

Вы должны также удалить mips; SQLCipher для Android включает только собственные библиотеки для armeabi, armeabi-v7a и x86.

+0

ok, thanks Nick – gerhard

 Смежные вопросы

  • Нет связанных вопросов^_^