Android踩坑之couldn't find "libClingSDK.so"
在android開發中一些涉及到硬件級的API需要引入第三方的sdk,通常都是一個jar包搭配一個.so文件,.so文件用於處理底層交互,這是C/C++超原生級別的,而不是JVM級別的。
最近在作Cling手環的app開發,踩到一個巨坑
這里要點名批評Cling的公司,SDK老不說,給出的官方文檔和demo沒有任何的更新,害我為了這個破.so文件耗費了一天多。
錯誤提示如下:
2020-05-19 14:01:38.344 16064-16064/com.hicling.iictcling E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.hicling.iictcling, PID: 16064
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.hicling.iictcling-5csq516Kff5PGkzYXaSCUw==/base.apk"],nativeLibraryDirectories=[/data/app/com.hicling.iictcling-5csq516Kff5PGkzYXaSCUw==/lib/arm64, /system/lib64, /system/product/lib64]]] couldn't find "libClingSDK.so"
at java.lang.Runtime.loadLibrary0(Runtime.java:1067)
at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
at java.lang.System.loadLibrary(System.java:1667)
at com.hicling.clingsdk.bleservice.ClingBleControl.<clinit>(Unknown Source:2)
at com.hicling.clingsdk.bleservice.ClingBleControl.a(Unknown Source:0)
at com.hicling.clingsdk.bleservice.ClingCommunicatorService.onCreate(Unknown Source:15)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3987)
at android.app.ActivityThread.access$1600(ActivityThread.java:220)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1899)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7520)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
錯誤是通過Android studio的Logcat打印出來的,app的現象是啟動直接閃退,出現錯誤的代碼段是:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ClingSdk.init(this, "HCd176b8b47b3ed84c", "92f767d18c3e843bb23e317617c55175", clingReady)
ClingSdk.setBleDataListener(bleDataListener)
ClingSdk.setDeviceConnectListener(mDeviceConnectedListener)
ClingSdk.enableDebugMode(true)
ClingSdk.start(this)
// init everything in this activity, mainly the elements , webview
init()
}
其實也就是ClingSdk調用的時候。
話說回來,第三方的sdk真的坑太多了,以下是針對so文件找不到的解決方案:
打開build.gradle(Module:app)
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.hicling.iictcling"
minSdkVersion 14
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk {
// 設置支持的SO庫架構,第三方給的so庫哪幾種架構,就配置這幾種架構
abiFilters 'armeabi' , 'armeabi','x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
在defaultConfig中添加ndk配置
這里給初學者普及以下,ndk相對於sdk
ndk是面向底層C/C++接口調用的,這是最底層,幾乎接近操作系統級別的調用,大部分用於一些特殊的硬件,這里Cling手環主要就是藍牙設備功能的封裝
sdk是安卓操作系統提供的接口,調用的是安卓系統的提供的功能,基於JVM或者是安卓自己虛擬機的東西。
ndk比sdk的層次更深