Android踩坑之couldn't find "libClingSDK.so"
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的层次更深