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的层次更深

原文地址:https://www.cnblogs.com/devilyouwei/p/12916683.html