2011-07-11 69 views
4

我是一位經驗豐富的Java編碼人員,但我是XCode和C++的新手,非常抱歉,這個愚蠢的問題。需要幫助鏈接到捆綁在OS X上

我在XCode中編寫了一些需要實例化Java虛擬機的C++代碼。有一個名爲JavaVM_GetJNIEnv()的OS X的Java插件的方法,並在來自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?

回答

1

我想通了。如果你試圖引用存儲在一個.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。

1

您需要鏈接到框架,而不是捆綁。選擇'Add Existing Framework'並選擇JavaVM.framework,Xcode應該處理其餘的部分!

+0

我已經在我的框架列表中有JavaVM.framework ...也許這個函數是在不同的庫中定義的。我會用'nm'做一些狩獵來試圖找出究竟哪個二進制文件具有我正在尋找的功能;也許我只需要添加一個不同的框架。 –

+0

好吧,我找到了文件的真實位置。我用'nm'來驗證我需要的功能是否包含在內。實際二進制文件的位置是'/System/Library/Java/Support/Deploy.bundle/Contents/Resources/JavaPlugin2_NPAPI.plugin/Contents/MacOS/JavaPlugin2_NPAPI'。由於我不能將捆綁包添加到XCode,我將如何鏈接到此? –

+0

在osx下,gcc包裝接受-F

和-framework 作爲參數。 -F/-framework類似於-L/-l,但我認爲sbooth是正確的 - 如果它沒有正確鏈接,某些東西是不可靠的。 – synthesizerpatel