2011-01-31 37 views
2

現在、Eclipse CDTとMinGWを使用して、JNI用にDllをコンパイルしようとしています。MinGWのコンパイラオプションWl、kill-atが機能しない

チュートリアルの後、ネイティブメソッドを宣言したJavaクラスを作成し、javahを使用して関連するヘッダーファイルを取得し、C++クラスで実装しました。

C++コードは非常にシンプルで、コンパイルは動作しますが、私はJavaクラスにライブラリをロードするとき、私はこのエラーを取得:私は「探求」

Exception in thread "main" java.lang.UnsatisfiedLinkError: Main.integerMethod(I)I 
    at Main.integerMethod(Native Method) 
    at Main.main(Main.java:12) 

のdllをし、方法ことがわかったことすべて "@ 14"のような接尾辞が付いています。問題は、私はすでに、これらの非常に恥ずかしいタグを削除する必要がある-Wl、 - kill-atコンパイラオプションを使用しています...なぜそれが動作しないのですか?

コンパイルログは以下の通りです:

**** Rebuild of configuration DLL for project JniCTest **** 

**** Internal Builder is used for build    **** 
g++ -IC:\Program Files\Java\jdk1.6.0_13\include -IC:\Program Files\Java\jdk1.6.0_13\include\win32 -O3 -Wall -c -fmessage-length=0 -mno-cygwin -D__int64=long long -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -oMain.o ..\Main.cpp 
g++ -o libJniCTest.dll -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -shared -olibJniCTest.dll Main.o 
Build complete for project JniCTest 
Time consumed: 375 ms. 

は、コンパイラオプションについて何か問題はありますか?助けてくれてありがとう。

答えて

3

解決策が見つかりました。 --kill-atオプションは、正しいコマンドに入れられませんでした。事実、MinGWはファイルを.oオブジェクトファイルにコンパイルし、次に(2行目)この.oファイルからリンクを行います。したがって、オプションは2行目に配置する必要があります。ソースファイルMAIN.CPPと出力DLL libJniCTest.dllため

修正されたコマンド:

g++ -I"C:\Program Files\Java\jdk1.6.0_13\include" -I"C:\Program Files\Java\jdk1.6.0_13\include\win32" -O0 -Wall -c -oMain.o ..\Main.cpp 
g++ -Wl,--kill-at -shared -olibJniCTest.dll Main.o 
+0

ありがとうございましたdudeは私のために働いた – Akhilesh

0

また、連れて行ってくれました。この

extern "C" { 

//implemented methods 

} 

のような実装をラップすることを忘れないでください時間がわかります

+1

正解のための@ジョナと、スタックオーバーフローへようこそ:)しかし、1つの発言。質問に対する特定の回答よりも多くの発言をしたい場合は、回答ではなくコメントで記述する必要があります。 – Dunaril

0

私はこの簡単なことに従います。 JNI tutorialをIBMのサイト で実行し、特定のSample1.c fiをコンパイルしました次のコマンドをWindows XPに実行してください。その私のためにうまく動作します。

gcc -Wall -Wl,--kill-at -shared Sample1.c -o Sample1.dll -I"C:\Program Files\Java\jdk1.7.0\include" -I"C:\Program Files\Java\jdk1.7.0\include\win32"

P.S:お使いのシステムごとにJDKのパスを変更します。

関連する問題