0

バックグラウンド

JNIを介して既存のネイティブライブラリを利用するJavaプログラムを構築しようとしています。ネイティブプロジェクトには、それぞれ共有ライブラリを構築する2つのコンポーネントがあります。

  1. を構築core.libし、core.dll
  2. コアコンポーネントに依存し、ビルドapplication.libおよびapplication.dll

SWIGを使用して、application_wrap.cファイルと対応するJavaファイルを作成し、JNIを使​​用してネイティブライブラリにアクセスできるようにしました。

私がやりたいのは、application_jni.dllこのapplication_wrap.cファイルを含む新しい共有ライブラリ(それを呼びましょう)を構築して、次のようにJavaプログラムにロードできるようにすることです。

System.loadLibrary("application_jni");

問題

残念ながら、VisualStudioコンパイラを使用してWindowsでこれを行う方法を理解できないようです。これが私が試したことです:

まず、application_wrap.cSWIGによって生成されたファイルをコンパイルします。これによりapplication_wrap.obj、が生成され、正常に機能するようです。

cl /I "path/to/core/headers" /I "path/to/application/headers" -c application_wrap.c

次に、を既存の共有ライブラリに対してリンクしapplication_wrap.objて、新しい共有ライブラリを作成します。

link /dll /out:application_jni.dll application_wrap.obj core.lib application.lib

これにより、次のようなエラーが多数発生します。

application_wrap.obj : error LNK2019: unresolved external symbol __imp__function_in_core referenced in function_in_application_wrap

これらのエラーの原因は何でしょうか?私はWindowsでのコンパイルの経験があまりないので、コンパイルまたはリンクの段階でいくつかのフラグが欠落している(またはdllの動作を誤解している)ことに少しも驚かないでしょう。

いくつかの補足事項

ランニング

dumpbin /exports core.lib

は、エラーメッセージに記載されているすべての関数が、実際にはコア共有ライブラリによってエクスポートされていることを示しています。

編集

Pavelの提案で、私はそれがリンクするかどうかを確認するために簡単なCプログラムを作成しました。上記と同じコンパイルコマンドとリンクコマンドを使用しましたが、同じエラーが発生しました。

Cプログラムtest.c

#include "application.h"

int main() {
  function_in_application();
}

エラー:

test.obj : error LNK2019: unresolved external symbol __imp__function_in_application referenced in function _main
4

1 に答える 1

1

core.dllapplication.dllが64ビット用にコンパイルされており、のデフォルトのターゲットcl.exeが32ビットであるため、ライブラリはリンクに失敗しました。obj32ビットファイルを2つの64ビットにリンクしようとしたため、リンカーが失敗しましたdll's。すべてを64ビットでコンパイルすると、問題が解決しました。

注意すべき点がいくつかあります

  • 64ビットコンパイラがインストールされている場合は、ターゲットプラットフォームに対応する引数(「amd64」など)を指定しcl.exeてスクリプトを実行することにより、ターゲットを64ビットにします。vcvarsall.bat詳細な手順については、こちらをご覧ください
  • のデフォルトバージョンは、デフォルトVisual Studio Express 2010で64ビットコンパイラをインストールしません。setup.exeそれらをインストールするには、再度実行し、適切なカスタムインストールオプションを確認する必要がある場合があります。
  • のデフォルトバージョンにVisual Studio Express 2012は64ビットコンパイラが付属しています。2010バージョンをアンインストールし、2012をインストールしましたが、その後は問題ありませんでした。
于 2013-01-16T16:23:57.087 に答える