バックグラウンド
JNIを介して既存のネイティブライブラリを利用するJavaプログラムを構築しようとしています。ネイティブプロジェクトには、それぞれ共有ライブラリを構築する2つのコンポーネントがあります。
- を構築
core.lib
し、core.dll
- コアコンポーネントに依存し、ビルド
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.c
SWIGによって生成されたファイルをコンパイルします。これにより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