問題タブ [or-tools]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 必要なオブジェクト ファイルを正常にロードした後でも、JNI 依存関係をロード中に Java で UnsatisfiedLinkError (未定義のシンボル) を取得する
プロジェクトに Google OR-tools ライブラリ (v6.4) を使用しています (私の質問はこのライブラリに固有のものではありません)。これは、いくつかのネイティブな依存関係 (OS に応じて、".so"/".dylib" オブジェクト ファイルの束) を持つ 1 つの jar で構成されます。私のプロジェクトのこのビルドは、Ubuntu 14.04 で作成されています
私が直面している問題: 実行時に特定のオブジェクト ファイルをロードしようとすると (を使用してSystem.load()
)、「未定義のシンボル」というメッセージと共に UnsatisfiedLinkError が発生します (以下にスタック トレースを追加しました)。ただし、この直前にこのシンボルを定義するオブジェクト ファイルをロードしているため、このエラーがスローされる理由がわかりません。
次の方法で依存関係をロードしています。オブジェクト ファイルは、ビルド中に Maven によって作成された jar にパックされ、System.load()
実行時に抽出されてロードされます (を使用)。その方法は次のとおりです。
このメソッドは、すべての依存関係の静的ブロック内で呼び出されています。
libdimacs.soに対して実行System.load()
すると、UnsatisfiedLinkError がスローされます。スタックトレース:
ただし、このシンボル「_ZN6google14FlagRegistererC1IbEEPKcS3_S3_PT_S5_」は、libdimacs の前にロードされている libortools.so に存在します。次のコマンドを実行してこれを確認しました。
これにより、次の出力が得られました。
System.load()
そのため、含まれているオブジェクト ファイルの読み込みに問題がなければ、呼び出し時にシンボルを定義する必要があるように思われます。オブジェクト ファイルが正しく読み込まれたかどうかを確認するために、このソリューションで詳しく説明されている方法を使用しました。その回答で詳述されているクラスとは別に、System.load()
呼び出しの後に次の行を追加してEnvironmentUtils.loadResourceFromJar()
、最後にロードされたライブラリ名を出力しました。
出力 (UnsatisfiedLinkError の直前まで) は次のとおりです。
そのため、libortools.so は正しくロードされているようです。つまり、シンボルをメモリにロードする必要があります。まったく同じコードが、対応する Mac (「.dylib」) 依存関係 (MacOS Sierra 10.12.5 でビルド) と完全に連携しています。これを解決するためのアドバイスをいただければ幸いです。ありがとうございました。