0

そのため、JNIを使​​用してC++でJavaクラスを呼び出そうとしていますが、実行しようとするまですべてがうまく見えます。Xcodeでエラーが発生します

Undefined symbols for architecture x86_64: "_JNI_CreateJavaVM", referenced from:

アーキテクチャと関係があると思いますが、これを修正する方法がわかりません。

Java VM の初期化に使用するコードは次のとおりです。

JNI_CreateJavaVM(&internal::gJVM, 
(void**)&internal::gEnv, &vm_args);

私は Mac を使用しています。何かアイデアがあれば、Mac ソリューションを投稿してください。実行時にライブラリをロードしないようにしています。ありがとう

4

2 に答える 2

0

ライブラリが不足しているようです。gcc を使用している場合は、すべての を確認してください-l。VS を使用している場合は、[構成] -> [リンカー] -> [入力] の下にある [追加の依存関係] オプションを確認してください。

また、必要なライブラリの x86_64 バージョンがあることも確認してください。

于 2012-10-07T21:17:03.197 に答える
0

私が見たすべての例では、その関数を直接呼び出さないことで問題を回避しているため、リンクする必要がないため、エラーは発生しません。トリックは、実行時に関数を検索し、関数ポインターを介して呼び出すことです。Windows での方法は次のとおりです。他のオペレーティング システムで実行するための構文がわかりません。

[免責事項 - いくつかの関数からコードをコピーして貼り付けたため、コンパイル エラーが発生した可能性があります。これはコンパイルされる場合とされない場合がありますが、開始する必要があります]

最初に、関数へのポインター用に独自の typedef を作成します。

typedef jint (JNICALL* JvmCreateProcTypeDef)(JavaVM **, void **, void);

LoadLibraryを使用して JVM dll を検索します。JVM DLL の場所を見つけるのはアプリケーション次第です。私たちの場合、サードパーティの JRE を配布し、DLL がどこにあるのかを知っていました。

HMODULE jvmDll = LoadLibrary(jvmDllPath);

次に、 GetProcAddressを使用して JVM dll から関数のアドレスを検索します。

JvmCreateProcTypeDef jvmCreateProc = (JvmCreateProcTypeDef) GetProcAddress(jvmDll,"JNI_CreateJavaVM");

関数を直接呼び出すコードを、関数ポインターを介して呼び出す次のようなコードに置き換えます。

jvmCreateProc(&internal::gJVM, (void**)&internal::gEnv, &vm_args);

これにより、すべてのコンパイル リンク エラーに合格するはずです。あとは、コードが DLL を見つけられない場合のランタイム エラーに対処するだけです :)

お役に立てれば!

于 2012-10-07T21:57:42.217 に答える