私が見たすべての例では、その関数を直接呼び出さないことで問題を回避しているため、リンクする必要がないため、エラーは発生しません。トリックは、実行時に関数を検索し、関数ポインターを介して呼び出すことです。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 を見つけられない場合のランタイム エラーに対処するだけです :)
お役に立てれば!