1

次の形式で関数をエクスポートする.dllライブラリがあります。

_Java_folder1_folder2_folder3_JavaClassName_javamethodname @ 16

.dllを変更できません。それは私に与えられました。

ネイティブを呼び出すJavaプログラムを作成する必要がありますjavamethodname。ただし、正しいヘッダーファイルを生成するのに問題があります。上記で指定した署名を使用してヘッダーファイルを生成するにはどうすればよいですか?

javah -jni JavaClassNameを試しましたが、目的の結果が得られません。ディレクトリ階層内からjavahを呼び出すと、次のようなヘッダーが表示されます。

Java_JavaClassName_javamethodname

ディレクトリ階層の外部からjavahを呼び出そうとすると、エラーが発生します。

また、Javaの前のヘッダー署名でアンダースコアを取得するにはどうすればよいですか?つまり、Javaではなく_Javaです。

ありがとう!

4

3 に答える 3

1

Javaクラスをパッケージfolder1.folder2.folder3に配置します。

Cソースコードには、アンダースコアなしで「Java_folder1_folder2_folder3_JavaClassName_javamethodname」という名前が付けられます。

ネイティブメソッドが期待しているパラメータを決定する必要があります。

于 2012-06-20T19:12:23.663 に答える
1

Javaコードの記述は簡単です。パッケージ名folder1.folder2.folder3でJavaプロジェクトを作成しJavaClassName、そこにクラスを配置しますnative javamethodname。DLLを作成し、再構築しているのと同じクラスを持っている誰かによってすでに行われているヘッダーなどを生成する必要はありません。

Java_プレフィックスは標準であり、JVM-JNIリンカーによって追加されます。気にする必要はありません。

ただし、行間で、先頭のアンダースコアにも問題があることを読みました。これは「コンパイラの装飾」であり、DLLのみ(ソースなし、再コンパイルなし)を入手した場合は、運命にある可能性があります。さまざまなコンパイラーがさまざまな「装飾」を追加して、呼び出し元(JVM)と呼び出し先(DLL)の間で呼び出し規約を混同しないようにします。いくつかの観察可能なデフォルトの動作があり、さまざまなコンパイラオプションや定義ファイル(MSVCの.def)によって変更される可能性があります。これはどちらもあなたのケースには当てはまりません。だからあなたは必要です:

  1. DLLの作成に使用されたコンパイラを確認してください
  2. 与えられたコンパイラが観察されたシンボル装飾を生成する呼び出し規約を調べてください
  3. DLLは、JNICALLマクロとして定義されているのと同じ呼び出し規約を持つJVMを介してのみ実行可能です。$JAVA_HOME/include/your_platform/jni_md.h
于 2012-06-21T12:41:38.453 に答える
0

DLLにネイティブメソッド宣言を含む対応するJavaクラスがまだ付属していない場合、DLLは不完全であり、おそらく100%役に立たないでしょう。これをリバースエンジニアリングすることを期待すべきではありません。正しく構築されていない可能性もあります。これをさらに進める前に、それが機能するという証拠を求めているでしょう。その証拠にはJavaの部分が含まれている必要があります。そうでなければ、それは証拠ではありません。

于 2012-06-20T19:48:41.557 に答える