錯誤信息:
java.lang.UnsatisfiedLinkError: hsl.p2pipcam.nativecaller.NativeCaller
at hsl.p2pipcam.manager.DeviceSDK.createDevice(DeviceSDK.java:74)
at hsl.p2pipcam.manager.Device.createDevice(Device.java:66)
at cn.yycloud.fragments.WebCameraFragment.onClick(WebCameraFragment.java:256)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
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)
終於解決了困擾我半個世紀的難題,記錄下:
我的項目中使用了別人的so類,已經打包好了,且只有armeabi這一種。按說應該是兼容性最好的了,但是問題偏偏出現了!!!
一旦加載so時就會報錯Java.lang.UnsatisfiedLinkError ,各種千百度和google只有和我類似,從沒有和我一樣的情況。從出現這個問題 到現在解決 中間省略可以繞地球一圈的文字。。。
so庫交叉編譯時 可選arm,x86,mips三種架構,者三種結構還有32位於64位之分。
百度得知其中有個坑:
如果你的項目中有arm64-v8a,當你的app在64位arm架構的cpu手機上運行時,只會從arm64-v8a找so庫,找不到就報錯,不會再去armeabi-v7a和armeabi里去再找。
如果沒有arm64-v8a文件夾的話,會從armeabi-v7a找,找不到就去armeabi找。都找不到才報錯。
但是!!!經過N次報錯后,,,
我發現手機只會根據cpu找對應文件夾下的so加載,沒有就特么的直接報錯,根本不會重新去別的文件夾下找!!!!(我懷疑可能eclipse和Android studio編譯的原因,或者新版安卓系統加載so庫的策略改變了)
最后我的解決辦法是:新建armeabi,armeabi-v7a,arm64-v8a,arm-v8a,然后在四個文件夾內 分別拷貝一份so庫放入。