- JNI を使用して c/c++ で実装する必要がある Java のすべてのネイティブ メソッドを列挙できますか?
- ネイティブ メソッドを名前で列挙できますか (同じ名前のオーバーロードが複数存在する可能性があります)?
- メソッド シグネチャを取得して、JNI で使用されるメソッド シグネチャを生成するにはどうすればよいですか?
それらを呼び出して java.lang.UnsatisfiedLinkError 例外を取得しようとする代わりに、すべてのネイティブ jni メソッドが適切にバインドされているかどうかを確認する方法はありますか。Java 側または C++ 側を適切に更新せずにいずれかの側でメソッド シグネチャが変更されることがあります。デバッグ コードを追加して、これらの問題を検出して処理したいと考えています (おそらく、適切なメソッド シグネチャを生成してログに出力することで、簡単に修正できます)。コード)。
私は JNI ソリューションを好みますが、Java 側の助けを借りて何かを行うことができれば、それも問題ありません。Javaで宣言されていないregisterNativesおよびregisterメソッドを使用すると、失敗してlogcatに出力されます。
E/dalvikvm( 1445): ERROR: couldn't find native method
E/dalvikvm( 1445): Requested: Lcom/bla/bla/bla/Test;.nativeTestXX:()Z
しかし、このエラーをキャッチして自分で処理したいと思います。それは可能ですか?
編集: 私の JNI コードには、すべてのネイティブ メソッドを登録する静的な nativeInit ( Android JNI のヒントで提案されているように) があります。同じ関数で、すべてのネイティブ メソッドが適切にバインドされていることを確認したいと思います。つまり、初期化されていないメソッドが呼び出されてアプリが存在するまで待つ必要はありません。私が抱えている問題: さまざまな ppl によってさまざまな時期に書かれた多くの jni コードがあり、いくつかのメソッドは単純に正しくなくなりましたが、それらはいくつかのあいまいな状況でのみ使用されます。私にとって最善の方法は、すべてのネイティブ メソッドが何らかの c++ 関数にバインドされていることを確認することだと思います。もう 1 つの問題は、JNI コードの一部がこれらすべての Long_java_names をエクスポートすることによってバインドを使用することであり、どちらの側でもメソッド シグネチャの変更を検出できません。