5
  1. JNI を使用して c/c++ で実装する必要がある Java のすべてのネイティブ メソッドを列挙できますか?
  2. ネイティブ メソッドを名前で列挙できますか (同じ名前のオーバーロードが複数存在する可能性があります)?
  3. メソッド シグネチャを取得して、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 をエクスポートすることによってバインドを使用することであり、どちらの側でもメソッド シグネチャの変更を検出できません。

4

1 に答える 1

0

「バインドされていない」ネイティブ メソッドをチェックする呼び出しはありません。RegisterNatives を使用して明示的な登録を実行すると、登録するすべてのメソッドが Java ソースで一致する宣言を持つようになりますが、ネイティブで宣言されたメソッドの実装がないかどうかを確認する方法はありません (それを呼び出して例外をキャッチする以外に)。

ネイティブ実装のメソッドが呼び出される時点で、まだ何も登録されていない場合、Dalvik はさまざまな共有ライブラリを検索して一致するものを見つけます。あなたが望むように聞こえるのは、この検索を強制し、実際にメソッドを呼び出さずに結果を確認する方法です。そのようなことはない。

ネイティブ宣言されたメソッドのリストを静的にまたは実行時に生成するにはさまざまな方法がありますが、実装が利用可能かどうかを判断する方法も必要です。長期的には、コードを実行する単体テストを実行したほうがよいでしょう。

于 2012-11-07T22:03:10.487 に答える