VS-Android を使用して NDK プログラムをビルドしています。「bridge」と「utils」の 2 つのライブラリがあり、最初のライブラリは 2 番目のライブラリを使用します。どちらのライブラリも正常にコンパイルされ、ファイルは libbridge.so および libutils.so として正しく命名されます。しかし、ファイルをロードしようとすると、libbridge.so が liblibutils にアクセスできないという UnsatisfiedLinkError が表示されます。liblibutils を検索しようとするのはなぜですか?
ライブラリをロードするために使用するJavaコードは次のとおりです。
static
{
System.loadLibrary("utils"); // This loads OK
System.loadLibrary("bridge"); // This is found but causes the UnsatisfiedLinkError
}
私が得る正確なエラーは次のとおりです。
java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "liblibutils"
needed by "libbridge.so"; caused by library "liblibutils" not found
両方のライブラリ ファイルは同じフォルダーにあります。
(projectfolder)/libs/armeabi-v7a/libbridge.so
(projectfolder)/libs/armeabi-v7a/libutils.so
さて、Visual Studio では、libutils.so のリンク フェーズの関連する出力は次のとおりです。
-o E:/NDKProject/Debug/armeabi-v7a/libutils.so -lc -lm -llog -lgcc -Wl,-soname,libutils
libbridge.so の関連する出力:
-o E:/NDKProject/Debug/armeabi-v7a/libbridge.so
-LE:/NDKProject/Debug/armeabi-v7a -lutils -lc -lm -llog -lgcc -Wl,-soname,libbridge
libutils.so のプロジェクト プロパティは次のようになります。
- ターゲット名: libutils
- 「soname」設定: $(TargetName)
libbridge.so の場合:
- ターゲット名: libbridge
- 「soname」設定: $(TargetName)
- 追加の依存関係: -lutils
私は困惑しています。bridge ライブラリが utils ライブラリを使おうとすると、余分な「lib」はどこに来るのですか? utils ライブラリは正常にロードされます。また、utils ライブラリをリンクせず、utils ライブラリ内のものへのすべての呼び出しをコメントアウトしない場合、bridge ライブラリも正常にロードされます。
これまで、ターゲット名を「libutils」ではなく「utils」に変更しようとしましたが、うまくいきません。soname 設定として lib$(TargetName) も使用しようとしましたが、どちらも機能しません。