20191111 集成android sdk,華為手機基本都啟動報錯,如下:
W/System.err: java.security.NoSuchProviderException: no such provider: Crypto
W/System.err: at sun.security.jca.GetInstance.getService(GetInstance.java:83)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
at java.security.SecureRandom.getInstance(SecureRandom.java:382)
W/System.err: at io.dcloud.common.adapter.util.DCloudTrustManager.createSecureRandom(DCloudTrustManager.java:46)
at io.dcloud.common.util.NetTool.createConnection(NetTool.java:215)
W/System.err: at io.dcloud.common.util.NetTool.request(NetTool.java:78)
at io.dcloud.common.util.NetTool.httpGet(NetTool.java:34)
at io.dcloud.common.util.NetTool.httpGet(NetTool.java:42)
at io.dcloud.common.b.a$1.run(Core.java:202)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
W/System.err: at java.lang.Thread.run(Thread.java:784)
E/NativeLoader: loadException
java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/com.ynhtbank.beta.htbank/files/libs/libBaiduMapSDK_base_v4_3_1.so" is 32-bit instead of 64-bit
at java.lang.Runtime.load0(Runtime.java:928)
at java.lang.System.load(System.java:1624)
at com.baidu.platform.comapi.NativeLoader.f(Unknown Source:13)
at com.baidu.platform.comapi.NativeLoader.a(Unknown Source:13)
at com.baidu.platform.comapi.NativeLoader.c(Unknown Source:8)
at com.baidu.platform.comapi.NativeLoader.loadCustomizeNativeLibrary(Unknown Source:51)
at com.baidu.platform.comapi.NativeLoader.loadLibrary(Unknown Source:40)
at com.baidu.platform.comapi.a.<clinit>(Unknown Source:20)
at com.baidu.platform.comapi.a.a(Unknown Source:0)
at com.baidu.platform.comapi.c.a(Unknown Source:16)
at com.baidu.mapapi.SDKInitializer.initialize(Unknown Source:0)
at com.baidu.mapapi.SDKInitializer.initialize(Unknown Source:1)
at io.dcloud.js.map.MapInitImpl.onStart(MapInitImpl.java:25)
at io.dcloud.common.b.a.a(Core.java:449)
at io.dcloud.common.b.a.a(Core.java:151)
at io.dcloud.common.b.b.a(PandoraEntryProxy.java:52)
at io.dcloud.EntryProxy.onCreate(EntryProxy.java:96)
at com.ynhtbank.MainActivity.onCreate(MainActivity.java:67)
at android.app.Activity.performCreate(Activity.java:7372)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3147)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302)
at android.app.ActivityThread.-wrap12(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891)
at android.os.Handler.dispatchMessage(Handler.java:108)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7425)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
E/NativeLoader: BaiduMapSDK_base_v4_3_1 Failed to load.
E/zygote64: No implementation found for int com.baidu.platform.comjni.tools.JNITools.initClass(java.lang.Object, int) (tried Java_com_baidu_platform_comjni_tools_JNITools_initClass and Java_com_baidu_platform_comjni_tools_JNITools_initClass__Ljava_lang_Object_2I)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.ynhtbank.beta.htbank, PID: 24657
java.lang.UnsatisfiedLinkError: No implementation found for int com.baidu.platform.comjni.tools.JNITools.initClass(java.lang.Object, int) (tried Java_com_baidu_platform_comjni_tools_JNITools_initClass and Java_com_baidu_platform_comjni_tools_JNITools_initClass__Ljava_lang_Object_2I)
at com.baidu.platform.comjni.tools.JNITools.initClass(Native Method)
at com.baidu.platform.comjni.tools.a.b(Unknown Source:6)
at com.baidu.platform.comapi.a.<clinit>(Unknown Source:23)
at com.baidu.platform.comapi.a.a(Unknown Source:0)
at com.baidu.platform.comapi.c.a(Unknown Source:16)
at com.baidu.mapapi.SDKInitializer.initialize(Unknown Source:0)
at com.baidu.mapapi.SDKInitializer.initialize(Unknown Source:1)
at io.dcloud.js.map.MapInitImpl.onStart(MapInitImpl.java:25)
at io.dcloud.common.b.a.a(Core.java:449)
at io.dcloud.common.b.a.a(Core.java:151)
at io.dcloud.common.b.b.a(PandoraEntryProxy.java:52)
at io.dcloud.EntryProxy.onCreate(EntryProxy.java:96)
at com.ynhtbank.MainActivity.onCreate(MainActivity.java:67)
at android.app.Activity.performCreate(Activity.java:7372)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3147)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302)
at android.app.ActivityThread.-wrap12(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891)
at android.os.Handler.dispatchMessage(Handler.java:108)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7425)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
I/zygote64: Compiler allocated 5MB to compile boolean io.dcloud.common.a.d.a(java.io.InputStream, java.lang.String, org.json.JSONObject)
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/.imei.txt (Permission denied)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:200)
at java.io.FileInputStream.<init>(FileInputStream.java:150)
at io.dcloud.common.util.TelephonyUtil.getIMEI(TelephonyUtil.java:243)
W/System.err: at io.dcloud.common.util.TelephonyUtil.getIMEI(TelephonyUtil.java:33)
at io.dcloud.common.adapter.util.UEH.commitBaseUncatchInfo(UEH.java:139)
at io.dcloud.common.adapter.util.UEH.commitUncatchException(UEH.java:168)
at io.dcloud.common.adapter.util.UEH.access$100(UEH.java:35)
at io.dcloud.common.adapter.util.UEH$1.uncaughtException(UEH.java:52)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063)
at java.lang.Thread.dispatchUncaughtException(Thread.java:1973)
I/zygote64: Do full code cache collection, code=124KB, data=93KB
I/zygote64: After code cache collection, code=96KB, data=62KB
W/System.err: java.lang.UnsatisfiedLinkError: No implementation found for int com.baidu.platform.comjni.tools.JNITools.initClass(java.lang.Object, int) (tried Java_com_baidu_platform_comjni_tools_JNITools_initClass and Java_com_baidu_platform_comjni_tools_JNITools_initClass__Ljava_lang_Object_2I)
at com.baidu.platform.comjni.tools.JNITools.initClass(Native Method)
at com.baidu.platform.comjni.tools.a.b(Unknown Source:6)
=============================================================================================================
百度地圖 libBaiduMapSDK_base_v4_2_1.so" is 32-bit instead of 64-bit錯誤
有的手機默認支持64位,啟動的時候會嘗試加載64位的so。不過包卻不一定對64位做出支持。當系統無法加載到理想的包,就會拋出以下異常。
libBaiduMapSDK_base_v4_2_1.so" is 32-bit instead of 64-bit
不過,Android 64位是可以向下兼容32位程序的,apk只需要在budil.gradle中明確支持的指令集,以此適配手機即可。
defaultConfig {
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
————————————————
原文鏈接:https://blog.csdn.net/cao2884388/article/details/89478113
參考2:https://blog.csdn.net/yangbin0513/article/details/78212874
相關參考:
Android項目針對libs(armeabi,armeabi-v7a,x86)進行平台兼容
1.Android設備如何加載.so文件?
不同CPU架構的Android手機加載時會在libs下找自己對應的目錄,從對應的目錄下尋找需要的.so文件;如果沒有對應的目錄,就會去armeabi下去尋找,如果已經有對應的目錄,但是如果沒有找到對應的.so文件,也不會去armeabi下去尋找了。
以x86設備為例,x86設備會在項目中的 libs文件夾尋找是否含有x86文件夾,如果含有x86文件夾,則默認為該項目有x86對應的so可運行文件,只有x86文件夾而文件夾下沒有so,程序運行也是會出現find library returned null的錯誤的;如果工程本身不含有x86文件夾,則會尋找armeabi或者armeabi-v7a文件夾,兼容運行。以armeabi-v7a設備為例,該Android設備當然優先尋找libs目錄下的armeabi-v7a文件夾,同樣,如果只有armeabi-v7a文件夾而沒有 so也是會報錯的;如果找不到armeabi-v7a文件夾,則尋找armeabi文件夾,兼容運行該文件夾下的so,但是不能兼容運行x86的so。所以項目中如果只含有x86的so,在armeabi和armeabi-v7a也是無法運行的。以上就是不同CPU架構運行時加載so的策略。
2.對於不同的平台,我們應該怎么去進行適配?
目前主流的Android設備肯定是armeabi-v7a架構的,然后就是x86和armeabi了。如果同時包含了 armeabi, armeabi-v7a和x86,所有設備都可以運行,程序在運行的時候去加載不同平台對應的so,這是較為完美的一種解決方案,但是同時也會導致包變大。
armeabi-v7a是可以兼容armeabi的,而v7a的CPU支持硬件浮點運算,目前絕大對數設備已經是armeabi-v7a了,所以為了性能上的更優,就不要為了兼容放到armeabi下了。x86也是可以兼容armeabi平台運行的,另外需要指出的是,打出包的x86的so,總會比armeabi平台的體積更小,對於性能有潔癖的童鞋們,還是建議在打包so的時候支持x86。
3.如果第三方沒有提供對應平台的.so文件怎么辦?
有一些第三方的類庫只提供了armeabi下的.so文件,如果我們項目里適配了armeabi-v7a和x86,如果不在對應的文件下放對應的.so文件,就可能導致某些Android設備會出一些問題,我們可以復制armeabi下得.so文件到不同的文件夾下。如果第三方提供了不同平台的.so文件,則復制不同平台的.so文件到項目中對應的文件夾下即可。
