需要帮助链接到OS X上的bundle

时间:2011-07-11 19:42:06

标签: xcode cocoa macos linker bundle

我是一名经验丰富的Java程序员,但我是XCode和C ++的新手,对于这个愚蠢的问题感到抱歉。

我正在XCode中编写一些需要实例化Java虚拟机的c ++代码。 OS X Java插件中有一个名为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

所以我的问题是,如何使用XCode链接到.jnilib文件中的代码?

2 个答案:

答案 0 :(得分:2)

您需要链接到框架,而不是捆绑。选择“添加现有框架”并选择JavaVM.framework,Xcode应该处理剩下的工作!

答案 1 :(得分:2)

我明白了。如果你试图引用存储在.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 ...
}

顺便说一句,这对我的目的来说并不是非常有用,因为据我所知,java插件API只是为了从基于Mozilla的浏览器调用,我试图嵌入Java在我自己的应用程序中。