3

問題のコードは、Javaとネイティブコード間のJNIインターフェイスです。hファイルはjavahユーティリティによって作成されますが、cppファイルは人間によって作成されます。

Javaパーツの名前が変更された場合、javahは、必要に応じて、対応する名前の関数プロトタイプを生成します。ただし、cppファイルの関数の名前も変更されていることを確認するものはありません。すべて通常どおりにコンパイルされます。この問題は、Javaコードが実行時にネイティブAPIを呼び出す場合にのみ発生します。

コンパイル中にjavahによって生成されたhファイルとhumanによって生成された実装cppファイルの間の不一致をどのようにキャッチできますか?

4

1 に答える 1

2

生成された関数宣言をC++コードのどこかで参照するのはどうですか?

たとえば、(たとえば)generated_check.cppダミーパラメータを使用してプロトタイプを呼び出す関数を作成します(ただし、決して呼び出さないでください)。

#include "generated.h" // your javah output

static void neverCalled() {
     // Compiler errors here mean that the functions have changed:
     Java_com_example_package_MyClass_myFunc1(0, 0, 0);
     Java_com_example_package_MyClass_myFunc2(0);
}

コメントに応じて編集します。

generated.h別の(または補完的な)アプローチは、ビルドプロセスの一部として実行されるスクリプトを作成し、 javahが実行される前に古いものをバックアップし、新しいgenerated.hものが古いものと異なる場合にビルドエラーを引き起こすことです。diffプログラムを実行して、変更を特定するためのエラーメッセージを表示することもできます。

于 2012-11-29T19:19:52.863 に答える