2011-07-11 11 views
4

私は経験豊富なJavaコーダーですが、私はXcodeとC++を初めて使用しています。OS Xでバンドルするためのヘルプが必要です

私はJava仮想マシンをインスタンス化する必要があるXCodeにいくつかの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

バンドルではなくフレームワークにリンクする必要があります。 '既存のフレームワークを追加'を選択し、JavaVM.frameworkを選択すると、Xcodeは残りの部分を処理します!

+0

私はすでにフレームワークのリストにJavaVM.frameworkを持っています。おそらくその関数は別のライブラリで定義されています。私は 'nm'で狩りをして、探している機能がどのバイナリであるかを正確に調べようとします。多分私はちょうど別のフレームワークを追加する必要があります。 –

+0

OK、ファイルの実際の場所が見つかりました。私は、必要な機能が含まれていることを確認するために「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

関連する問題