为什么尝试在64位OS X上加载Java VM库时dlopen()失败? 我试图将java虚拟机库加载到C++程序中,这样我就可以使用JNI调用接口。在Linux上运行良好,但在Mac上无法运行。该测试程序演示了: #include <iostream> #include <dlfcn.h> int main() { if (const char *error = dlerror()) std::cout << "Flushed existing error: " << error << std::endl; dlopen( "/System/Library/Frameworks/JavaVM.framework/Libraries/libjvm.dylib", RTLD_NOW); // or RTLD_LAZY, no difference. if (const char *error = dlerror()) std::cout << "ERR: " << error << std::endl; }
我理解这个问题——libjvm.dylib不是一个胖文件,它只包含i386体系结构的目标代码,我运行在64位Mac和64位操作系统上。参考: 建议的解决方法是使用服务器JVM。但将libjvm.dylib更改为libserver.dylib会导致另一个我不理解的错误:为什么尝试在64位OS X上加载Java VM库时dlopen()失败? 我试图将java虚拟机库加载到C++程序中,这样我就可以使用JNI调用接口。在Linux上运行良好,但在Mac上无法运行。该测试程序演示了: #include <iostream> #include <dlfcn.h> int main() { if (const char *error = dlerror()) std::cout << "Flushed existing error: " << error << std::endl; dlopen( "/System/Library/Frameworks/JavaVM.framework/Libraries/libjvm.dylib", RTLD_NOW); // or RTLD_LAZY, no difference. if (const char *error = dlerror()) std::cout << "ERR: " << error << std::endl; },c++,c,macos,dlopen,C++,C,Macos,Dlopen,我理解这个问题——libjvm.dylib不是一个胖文件,它只包含i386体系结构的目标代码,我运行在64位Mac和64位操作系统上。参考: 建议的解决方法是使用服务器JVM。但将libjvm.dylib更改为libserver.dylib会导致另一个我不理解的错误: ERR: dlsym(RTLD_DEFAULT, func__entry): symbol not found 我因调用dlopen而收到dlsym错误。奇怪的nm确认libserver.dylib中不存在符号: $ lipo
ERR: dlsym(RTLD_DEFAULT, func__entry): symbol not found
我因调用dlopen而收到dlsym错误。奇怪的nm确认libserver.dylib中不存在符号:
$ lipo -info libjvm.dylib
Non-fat file: libjvm.dylib is architecture: i386
$ nm libjvm.dylib|grep func
0037b3c0 D _func__entry
U _jvm__func__entry
$ lipo -info libserver.dylib
Architectures in the fat file: libserver.dylib are: i386 x86_64
$ nm libserver.dylib|grep func
U _jvm__func__entry
我找不到有关此func\u条目的任何文档,也不知道下一步要尝试什么
编辑
此测试在SnowLeopard(10.6.8)上进行,默认JDK/JRE由Apple提供。我读到苹果将停止提供Java软件包,如果你升级到Lion,它们实际上会被删除。我不清楚新的“官方”JDK/JRE来自何处,但我安装并更改了对该库的dlopen调用:
"/Library/Java/JavaVirtualMachines/1.7.0u-dev.jre/Contents/Home/lib/server/libjvm.dylib"
就我所知,服务器JVM是x64平台上唯一的JVM。您能显示加载服务器JVM时调用dlsym
的代码吗?@BillyONeal,我在调用dlopen时收到dlsym错误。我发布的代码就是产生该错误的所有代码。我的猜测是,在内部,dlopen调用dlsym来获取某种类型的库静态构造函数/初始化例程func\uu entry,但它没有找到它。我希望它会给你同样的错误。另外,我应该注意,我不认为我专门安装了任何JDK,我只是有“库存”或Xcode安装的东西。据我所知,服务器JVM是x64平台上唯一的JVM。您能显示加载服务器JVM时调用dlsym
的代码吗?@BillyONeal,我在调用dlopen时收到dlsym错误。我发布的代码就是产生该错误的所有代码。我的猜测是,在内部,dlopen调用dlsym来获取某种类型的库静态构造函数/初始化例程func\uu entry,但它没有找到它。我希望它会给你同样的错误。另外,我应该注意,我不认为我专门安装了任何JDK,我只是有“库存”或Xcode安装的东西。
"/Library/Java/JavaVirtualMachines/1.7.0u-dev.jre/Contents/Home/lib/server/libjvm.dylib"