App有个功能。需要调用so库里面某个方法。
这里如何调用so省略,如有需要,请留言..
该项目是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库的参数 如果没有。去掉对应的参数即可
完美解决了,父掉子的方法。
记录一下。如有不对的地方。希望大佬们指点出来。
本人小扒菜一个..