JNI复制在Mac OS X库加载崩溃
问题描述:
我有两个共享库A.dylib和B.dylib都对应静态链接库萨JNI复制在Mac OS X库加载崩溃
当我只加载A.dylib与System.load或系统.loadLibrary,没有问题。对于B.dylib也是如此。
但是,当我打开一前一后(顺序并不重要),我看到了一些初始化代码的第二加载库崩溃。并且当我检查堆叠,所述崩溃码块是介于S.A
不知何故S.A符号被A.dylib和B.dylib之间共享时它们都装载。而这仅在Mac OS X发生堆栈清楚地表明,所述第二加载的一个调用经由第一加载的一个S.A的方法。更清楚;
- 负载A.dylib
- A#的init - >调用从静态链接萨
- 负载的方法B.dylib
- B#的init - >通过从A.静态链接萨调用一个方法dylib
我试图在不同的类加载器中加载A.dylib和B.dylib,但是这并没有改变结果。你知道是否有办法阻止这种共享?
答
嗯,我找到了解决办法,
的问题是,我猜到了静态库被默认所以在最后出现是因为重复的符号的名称冲突暴露自己的符号。
在链接动态库时,我将链接器标志-exported_symbols_list设置为仅包含暴露符号的输入文本文件。就我而言,那些只是JNI层级的方法; _Java_package_methodName _JNI_OnLoad _JNI_OnUnload
-exported_symbols_list仅导出输入文件中列出的符号。其余的是隐藏的,因此我有没有重复的符号。
我不知道为什么它不会在Linux和Windows发生,但。