Почему dlopen () терпит неудачу при попытке загрузить библиотеку Java VM на 64-битной OS X? - PullRequest
2 голосов
/ 08 марта 2012

Я пытаюсь динамически загрузить библиотеку 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"

и теперь кажетсяна работу.

...