Нужна помощь в связывании с комплектом на OS X - PullRequest
5 голосов
/ 11 июля 2011

Я опытный Java-кодер, но я новичок в XCode и C ++, так что извините за тупой вопрос.

Я пишу некоторый код на C ++ в XCode, который должен создавать экземпляр Java VirtualМашина.В плагине Java для OS X есть метод JavaVM_GetJNIEnv () и файл заголовка в исходном коде Sun / Oracle под названием JavaVM.h со следующими строками:

// Gets the JNIEnv* associated with the Java VM, creating the JVM
// instance if necessary. Note that the implementation of this routine
// must be prepared for it to be called from more than one thread.
JNIEnv* JavaVM_GetJNIEnv();

Я добавил файл .hв мой проект XCode, но я не знаю, как сделать ссылку на двоичный файл.Я понял, как принудительно загрузить компоновщик, например:

-force_load /System/Library/Java/Support/Deploy.bundle/Contents/Resources/JavaPlugin2_NPAPI.plugin/Contents/MacOS/JavaPlugin2_NPAPI

(этот файл является символической ссылкой; реальный путь - /System/Library/Java/Support/Deploy.bundle/Contents/Resources/JavaPlugin2_NPAPI.plugin/Contents/Resources/Java/libplugin2_npapi.jnilib)

Но тогда я получаю это сообщение об ошибке:

ld: in /System/Library/Java/Support/Deploy.bundle/Contents/Resources/JavaPlugin2_NPAPI.plugin/Contents/MacOS/JavaPlugin2_NPAPI, can't link with bundle (MH_BUNDLE) only dylibs (MH_DYLIB)
collect2: ld returned 1 exit status

Итак, мой вопрос, как мне связаться скод в файле .jnilib с кодом XCode?

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Я понял это.Если вы пытаетесь сослаться на код, хранящийся в .bundle, вы на самом деле не ссылаетесь на него, вы делаете вызовы к нему во время выполнения, а затем ссылаетесь на функции по имени (т. Е. Похоже на рефлексию Java, что мне больше нравитсязнакомы с).

NPError (*getEntryPoints)(NPPluginFuncs *aNPPFuncs); //Defines a variable which is a pointer to a function

CFURLRef bundleUrl = CFURLCreateWithFileSystemPath(NULL, CFSTR("/System/Library/Java/Support/Deploy.bundle/Contents/Resources/JavaPlugin2_NPAPI.plugin"), kCFURLPOSIXPathStyle, true);
CFBundleRef bundleRef = CFBundleCreate(NULL, bundleUrl);
getEntryPoints = (NPError (*)(NPPluginFuncs *))CFBundleGetFunctionPointerForName ( bundleRef, CFSTR("NP_GetEntryPoints" ) ); //Sets the pointer function to a function loaded from the bundle

if( getEntryPoints == NULL ) {
    printf("getEntryPoints is NULL");
} else {
    NPPluginFuncs pluginFuncs;
    pluginFuncs.size = sizeof(NPPluginFuncs);

    NPError err = getEntryPoints( &pluginFuncs ); //This is what actually calls the library function
    //... do more stuff with plugin API ...
}

Кроме того, это не оказалось очень полезным для моих целей, потому что, насколько я могу судить, API плагинов Java разработан только для вызова из Mozilla-браузеры, и я пытаюсь встроить Java в свое собственное приложение.

2 голосов
/ 11 июля 2011

Вам нужно ссылаться на фреймворки, а не на связки.Выберите «Добавить существующую платформу» и выберите JavaVM.framework, а Xcode должен обработать все остальное!

...