java、Andorid的ServiceLoader的简单使用,module之间的方法相互调用

61 阅读2分钟

App有个功能。需要调用so库里面某个方法。

这里如何调用so省略,如有需要,请留言..

image.png

该项目是app依赖于baselib,由于要和so库进行传参进行交互,so库里面的路径是写死的 比如xxx.xx.xxx.方法 这个是包名下的类名。

现在项目可以正常和so库进行交互。调用so库里面的方法并返回数据等。是没问题的。 但是:有一些封装的网络库或者封装的一些方法。是在baselib里面写着呢。 这样的话。在baselib里面无法调用子app里面的类里面的方法。怎么办呢?

请教了一位大佬,提供了2个思路 1: 采用组件化方式 AutoService 来实现 2: 采用jdk自带的ServiceLoader来实现, 由于本人比较菜。并没有做过组件化...于是用了ServiceLoader来实现

废话多了.

app调用so库的类,这个类名必须的和so里面写的路径一样,否则不成功,

 class Encryption {
     external fun encodeData(text:String): String
     external fun decodeData(text:String): String
    companion object {
       //so库去掉前面的lib以及后面的.so
        init {
            System.loadLibrary("jyShortVideo")
        }
    }
}

第一步: 在baselib目录里面创建接口:

interface InEncryption {
     fun encodeData(text:String): String
     fun decodeData(text:String): String
}

第二步: 在app目录下实现baselib的接口: 1:实现baselib的接口 2:并返回你需要的数据。如果没有则自行去掉 3:返回是调用so库的方法返回的。

class EncryptionUtils : InEncryption {
    override fun encodeData(text: String): String {
        return   Encryption().encodeData(text)
    }

    override fun decodeData(text: String): String {
        return   Encryption().decodeData(text)
    }
}

最后一步: 在你需要的地方:

val serviceLoader: ServiceLoader<InEncryption> = ServiceLoader.load(InEncryption::class.java)
for (myServiceLoader in serviceLoader) {
   strJson =myServiceLoader.encodeData(str)
}

strJson就是最终so库返回的数据。str是你给so库的参数 如果没有。去掉对应的参数即可

完美解决了,父掉子的方法。

记录一下。如有不对的地方。希望大佬们指点出来。

本人小扒菜一个..