特定の Java API は、呼び出し元に依存します。1 つの (非常に文書化されていない IMO) 例はSystem.load()、一部の JNI コードを呼び出し元ClassLoaderのみにロードする です。
おおよそのようなラッパーがありますJniUtils.loadLibrary("nameoflibrary")。現在のアーキテクチャに適したライブラリを見つけて、JAR から抽出し、に渡しSystem.load()ます。しかし、の呼び出し元がそれ自体JniUtils.loadLibraryと同じでないClassLoader場合に遭遇しました。Jniこれにより、ライブラリが間違った にロードされ、ネイティブ メソッドが呼び出されるようClassLoaderになりました。UnsatisfiedLinkError
のような JVM 内部に依存せずにsun.reflect.Reflection.getCallerClass()、この問題を回避する方法はありますか? 私の現在の考えは、ラッパーを次のように変更することです。
public class JniUtils {
public static void loadLibrary(String libraryName, MethodHandles.Lookup lookup);
}
これは次のように呼び出すことができます:
public class NeedsJni {
static {
JniUtils.loadLibrary("nameoflibrary", MethodHandles.lookup());
}
}
を使用してメソッドLookupを解決して呼び出すと、 caller として保存する必要があります。System.load()NeedsJni
より良い回避策はありますか?