共享库'/system/lib/libABC.so'已由CL 0x0打开;无法在0x429e5a50中打开

时间:2014-02-05 05:44:33

标签: android

在我的Android应用程序中,我遇到了这个崩溃。有人能说出为什么会发生这次事故吗?

日志说:

  

CL 0x0已经打开了共享库'/system/lib/libABC.so';无法在0x429e5a50中打开

这是否意味着应用尝试使用相同的应用加载.so多次 System.loadLibrary("ABC")

可能是什么原因?

1 个答案:

答案 0 :(得分:1)

到目前为止,这是理解。

根据Java类加载器,同样的.so不能加载到不同的类中。 在日志消息“共享库'/system/lib/libABC.so'已经由CL 0x0打开;无法在0x429e5a50中打开”CL表示类加载器。

我们可以看到这段安卓代码。这是android代码的路径

<强> /android/dalvik/vm/Native.cpp

在这个源文件中,如果我们从行号335到352观察到这部分代码,我们可以看到引导我们访问此日志消息的代码路径。

   pEntry = findSharedLibEntry(pathName)
    if (pEntry != NULL) {
       if (pEntry->classLoader != classLoader) {
            LOGW("Shared lib '%s' already opened by CL %p; can't open in %p",
                pathName, pEntry->classLoader, classLoader);
            return false;
        }
        if (verbose) {
            LOGD("Shared lib '%s' already loaded in same CL %p",
                pathName, classLoader);
        }
        if (!checkOnLoadResult(pEntry))
            return false;
        return true;
    }

所以在这段代码中,如果你看到,如果两个不同的类在尝试加载相同的库,那么我们可以看到下面的代码部分被执行了。

   if (pEntry->classLoader != classLoader) {
        LOGW("Shared lib '%s' already opened by CL %p; can't open in %p",
            pathName, pEntry->classLoader, classLoader);
        return false;
    }

那就是我们遇到崩溃的地方。

感谢我的一位朋友提供这些信息。 我很感激是否进行了任何编辑以添加有价值的信息。

干杯!!