特定の 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
より良い回避策はありますか?