0

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) も使用しようとしましたが、どちらも機能しません。

4

2 に答える 2

0

問題の原因がわかりました。古いバージョンのユーティリティ ライブラリが配置されている間違ったファイル (間違ったフォルダ) にリンクしていたことが判明しました。

于 2014-10-12T15:09:25.050 に答える
0

ログにliblibutilsが記載されている理由はわかりませんが、通常の Android システムで動作させるには、コードを変更する必要があります。その理由は、それlibutils.soが標準ディストリビューションの一部であり、/system/lib. loadLibrary()ネイティブ ローダーの場合は/system/lib、アプリ固有の lib ディレクトリよりも優先され、libutils.soを読み込む機会がありませんでした。したがって、UnsatisfiedLinkErrorは避けられません。

utils ライブラリにもっとユニークな名前を付けてください。

于 2014-10-11T13:18:01.130 に答える