考虑以下情况:我有两个名为P1和P2的android项目,它们都生成一个使用相同process-id的apk,并将在android上的相同进程中运行。 P1和P2都使用Java库JL1。 JL1在运行时加载共享库1 SL1。
我看到运行时在某些时候我在加载此SL1时遇到了java / lang / UnsatisfiedLinkError。 它还输出:已经打开了共享库。
是什么导致了这个问题?我假设java中的库代码在每个项目/ apk中被复制,并且在运行时,当apks在一个进程中合并时它会忘记副本。因此,每个副本都会加载其共享库本身,从而导致已加载的错误。
如果是这样,这不是不受欢迎的行为。因为,现在你不可能在同一个进程中多次使用带有共享库的java库。
[edit]我发现每个apk都使用自己的类加载器(同样在同一个进程中)。这意味着每个JL将按照apk加载类,因此每个共享对象将被加载多次,从而导致错误。有人想知道怎么解决这个问题吗?是否可以让apks共享一个类加载器?
答案 0 :(得分:1)
每个apk都有自己的类加载器。这意味着两个项目/ apks将拥有库中自己的类副本。它们在运行时加载。因此看起来像相同的类实际上是副本。因此,在这样的类中加载本机库将导致为每个加载的类加载它(即使这是在静态字段中完成的)。如果两个apks共享相同的进程,则会导致多次加载本机共享对象的运行时错误。