1

Android アプリが特定の ndk 呼び出しで散発的に UnsatisfiedlinkError 例外をスローする理由の手がかりを探しています。

ndk を介して 1 つのネイティブ ライブラリを読み込む Android アプリがあります。

ネイティブ ライブラリは C++ で記述され、STL を使用します (私のメイクファイルでは APP_STL := stlport_static を設定しています)。他のライブラリは使用または必要ありません。ネイティブ ライブラリには、約 20 の Java クラス用の約 300 のネイティブ メソッドがあります。

ほとんどの場合、すべて正常に動作します。しかし、時々、私のユーザーは UnsatisfiedLinkError 例外を受け取ります。例外は常に同じネイティブ関数呼び出しで同じ場所でトリガーされますが、奇妙なことに、それはネイティブ関数の最初の呼び出しでもなく、その特定のネイティブ関数の最初の呼び出しでもありません。

1 つの特定のネイティブ コールが失敗する可能性がある理由の手がかりは大歓迎です。ndk は簡単に壊れますか? このような問題をどのようにデバッグしますか?

同じ呼び出しを持つ単純なテスト プログラムは問題なく動作します。それにもかかわらず、ソースコードの一部を次に示します。

Java の ndk 関数の問題は次のとおりです。

public class Server {
...
    static private native long longObserveError( );
...
}

ヘッダー ファイルは次のとおりです。 extern "C" { ...

JNIEXPORT jlong JNICALL Java_be_gentgo_tetsuki_Server_longObserveError
  (JNIEnv *, jclass);
...
}

そして、実装は次のとおりです。

IGSProtocol *server = 0; // initialized later...

JNIEXPORT jlong JNICALL Java_be_gentgo_tetsuki_Server_longObserveError
  (JNIEnv *env, jclass)
 {
   Messenger &mess = server->ObserveError( );
   return (long)(&mess);
 }
4

1 に答える 1

2

ライブラリファイルの名前は何ですか? 別の SO 投稿 ( https://stackoverflow.com/a/18024816 ) に出くわしました。この男には、一部のデバイスにのみ存在するシステム ライブラリと競合するライブラリ名がありました。ライブラリの名前を変更すると、問題が解決しました。

于 2013-11-26T18:50:14.250 に答える