我的应用适用于Nexus 5,摩托罗拉Moto G4和电视盒性爱Minix Neo-X9。 但是当我尝试在LG G5或LeEco Le2上运行时,我遇到以下问题:
06-28 14:24:14.869: E/AndroidRuntime(7264): FATAL EXCEPTION: main
06-28 14:24:14.869: E/AndroidRuntime(7264): Process: com.vidyo.vidyomod, PID: 7264
06-28 14:24:14.869: E/AndroidRuntime(7264): java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.vidyo.vidyomod-1/base.apk"],nativeLibraryDirectories=[/data/app/com.vidyo.vidyomod-1/lib/arm64, /data/app/com.vidyo.vidyomod-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "libVidyoClientApp.so"
06-28 14:24:14.869: E/AndroidRuntime(7264): at java.lang.Runtime.loadLibrary(Runtime.java:367)
06-28 14:24:14.869: E/AndroidRuntime(7264): at java.lang.System.loadLibrary(System.java:1076)
06-28 14:24:14.869: E/AndroidRuntime(7264): at com.vidyo.VidyoClientLib.LmiAndroidAppJni.<clinit>(LmiAndroidAppJni.java:692)
06-28 14:24:14.869: E/AndroidRuntime(7264): at java.lang.Class.newInstance(Native Method)
06-28 14:24:14.869: E/AndroidRuntime(7264): at android.app.Instrumentation.newApplication(Instrumentation.java:1001)
06-28 14:24:14.869: E/AndroidRuntime(7264): at android.app.Instrumentation.newApplication(Instrumentation.java:986)
06-28 14:24:14.869: E/AndroidRuntime(7264): at android.app.LoadedApk.makeApplication(LoadedApk.java:582)
06-28 14:24:14.869: E/AndroidRuntime(7264): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5116)
06-28 14:24:14.869: E/AndroidRuntime(7264): at android.app.ActivityThread.-wrap2(ActivityThread.java)
06-28 14:24:14.869: E/AndroidRuntime(7264): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1628)
06-28 14:24:14.869: E/AndroidRuntime(7264): at android.os.Handler.dispatchMessage(Handler.java:111)
06-28 14:24:14.869: E/AndroidRuntime(7264): at android.os.Looper.loop(Looper.java:207)
06-28 14:24:14.869: E/AndroidRuntime(7264): at android.app.ActivityThread.main(ActivityThread.java:5917)
06-28 14:24:14.869: E/AndroidRuntime(7264): at java.lang.reflect.Method.invoke(Native Method)
06-28 14:24:14.869: E/AndroidRuntime(7264): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
06-28 14:24:14.869: E/AndroidRuntime(7264): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)
代码是一样的,它如何在手机上工作,而不是在另一部手机上工作? 我的意思是,它运行的库在某些方面是完美的,而在其他方面则不是。我测试过,例如LeEco是6.00,而Nexus 5的工作是6.0.1。所以我认为这不是Android操作系统问题
在我的jniLibs文件夹中,我有这个: jniLibs-&GT; armeabi-v7a-&GT; libVidyoClientApp.so
我是否还需要一个文件夹,如:jniLibs-&gt; arm64-v8a - &gt; libVidyoClientApp.so或类似的东西? 因为这条线问道:
/data/app/com.vidyo.vidyomod-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "libVidyoClientApp.so"
在我的build.gradle中,我有这个:
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src/main/libs'
}
答案 0 :(得分:1)
对于64位设备(大多数现代手机和平板电脑),您应该提供 lib / arm64-v8a 中的所有库,或者不提供。如果没有64位库,系统将很乐意使用 lib / armeabi-v7a 中的32位版本。但是如果有一个64位的lib(通常来自3个 rd 派对SDK),你的应用程序将会崩溃 UnsatisfiedLinkError 。
控制此操作的最简单方法是为 ndb-build ,usually in Application.mk file设置APP_ABI=armeabi-v7a
。
使用Android Studio (不是你的情况,jni.srcDirs = []
禁用NDK集成),gradle会覆盖它。您需要abiFilters in android.defaultConfig.ndk block或者像这样:
android {
defaultConfig {
externalNativeBuild {
cmake {
abiFilters "armeabi-v7a"
}
}
}
}
或者,您可以将所有库编译为64位。对于一些繁重的计算任务,您可以轻松获得显着的性能提升。在其他情况下,增益很小,但将C ++代码移植到64位可能是一项具有挑战性的工作。此外,这可能会显着扩大您的APK的大小。如果您选择同时提供应用的32位和64位版本,建议split the APK。
特别是对于渲染脚本,性能增益的可能性不会超过处理多个ABI的麻烦。请注意,即使您将目标API设置为低于21,gradle也会复制64位RenderScript库。
答案 1 :(得分:0)
显然这个问题是由一个coleague添加的图书馆引起的:
compile 'com.github.mmin18:realtimeblurview:1.1.0'
这个库在android defaultConfig中也需要这个:
renderscriptTargetApi 19
renderscriptSupportModeEnabled true
这导致图书馆无法在某些手机上工作