Я пытаюсь динамически загрузить библиотеку Java VM в программу 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;
}
Как написано, программа выводит:
ERR: dlopen(/System/Library/Frameworks/JavaVM.framework/Libraries/libjvm.dylib, 2): no suitable image found. Did find:
/System/Library/Frameworks/JavaVM.framework/Libraries/libjvm.dylib: mach-o, but wrong architecture
Я понимаю, что проблема - libjvm.dylib не является fat-файлом, он содержит только объекткод для архитектуры i386, и я работаю на 64-битной Mac, 64-битной ОС.Ссылка: http://java.net/jira/browse/MACOSX_PORT-8
Предложенный обходной путь - использовать вместо этого серверную JVM.Но изменение libjvm.dylib на libserver.dylib вызывает другую ошибку, которую я не понимаю:
ERR: dlsym(RTLD_DEFAULT, func__entry): symbol not found
Я получаю ошибку dlsym для вызова dlopen.Weird.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__entry
и не знаю, что попробовать дальше.
EDIT Это тестирование выполняется на Snow Leopard (10.6.8) со стандартным JDK / JRE, предоставленным Apple.Я читал, что Apple собирается прекратить предоставлять пакеты Java, и если вы обновитесь до Lion, они фактически будут удалены.Мне не ясно, откуда появился новый "официальный" JDK / JRE, но я установил этот JRE и изменил вызов dlopen для этой библиотеки:
"/Library/Java/JavaVirtualMachines/1.7.0u-dev.jre/Contents/Home/lib/server/libjvm.dylib"
и теперь кажетсяна работу.