Tencent / Shadow

零反射全动态Android插件框架
BSD 3-Clause "New" or "Revised" License
7.46k stars 1.3k forks source link

6.0系统插件主进程JNI报错 JNI ERROR (app bug): local reference table overflow (max=512) #1153

Closed DiamondProx closed 1 year ago

DiamondProx commented 1 year ago

@shifujun 你好,

能帮忙看一个问题吗?在6.0手机插件运行在主工程会报JNI冲突,当插件跟主工程都存在类似或者相同的jni库就会有问题

Debug工程 https://github.com/Tencent/Shadow/commit/931efe146a79e9e273ca7e61372f2b633241ca34

直接打开sample-plugin-app2

非6.0手机没问题, 如果改成非主进程也没问题。

shifujun commented 1 year ago

对于so库来说不存在插件机制这种事。shadow对此完全没有干预。所以你遇到的异常看起来没什么奇怪的。

DiamondProx commented 1 year ago

那这个是没办法解决吗,主要是非6.0的手机没这个问题。插件改成主进程有很多好处,主app跟插件或多或少也有一些公用的so

shifujun commented 1 year ago

不是没办法,而是与插件技术没什么关系。普通的app也会有这个问题。

DiamondProx commented 1 year ago

那可以把插件的so去掉,插件内load主工程的so吗?

shifujun commented 1 year ago

本来不就可以随意load so么?这跟插件技术没关系。建议你先看看so加载原理相关的文献吧。

DiamondProx commented 1 year ago

我大概看了一下 loadso 也是跟classloader有关系的, Runtime.getRuntime().loadLibrary0(VMStack.getCallingClassLoader(), libname); 所以插件内应该用不了宿主的so吧

zhuqichao commented 1 year ago

在Android6.0上测试并没有发现你说的这个问题,插件和宿主在同一进程使用同名的so,同名的函数不同实现,均能返回正却的结果,他们是由不同的classloader加载的,是隔离的

DiamondProx commented 1 year ago

@zhuqichao 你好,是用我的demo运行的吗?运行那个demo代码在几台6的系统都会崩溃,mumu模拟器也是6的系统,我会崩溃

zhuqichao commented 1 year ago

@zhuqichao 你好,是用我的demo运行的吗?运行那个demo代码在几台6的系统都会崩溃,mumu模拟器也是6的系统,我会崩溃

自己的demo运行的