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);
}