2012-04-23 14 views
5

私はWindows XPを使用しています。どうやらJNIとないUnsatisfiedLinkErrorが手をつないで行く...私はほとんどの時間は、リンカエラーがこのようになっていることに気付きました:JNI - ネイティブメソッドのUnsatisfiedLinkError

java.lang.UnsatisfiedLinkError: no whatever.dll in java.library.path 

しかし、それは私の問題ではありません。 Javaは私のDLLを見つけることができます。私はthis onethis onethis onethis one、そしてthis oneが、いずれも同様のStackOverflow上の類似した質問の数を見てみました

java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(lJava/lang/String;)Z 

:私は私が私が私の方法を間違っているという名前と思わせるエラーを取得していますこれらの方法のうちの1つが機能した。私はまた、Ubuntuのフォーラムでthis threadを見つけましたが、私はこれとまったく同じ問題を抱えていますが、質問者は自分の問題をどのように修正したのかは言いませんでした。これに関するすべてのGoogleの検索で、java.library.pathと同じエラーが表示されます。

これは私の実際のコードです。単位cm

NativeTest.java

class NativeTest 
    { 

    public static native boolean nativemethod (String arg); 

    public static void main (String[] args) 
     { 
     System.out.println(nativemethod("")); 
     System.out.println(nativemethod("012")); 
     } 

    static { System.loadLibrary("NativeTest"); } 

    } 

NativeTest.h

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class NativeTest */ 

#ifndef _Included_NativeTest 
#define _Included_NativeTest 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  NativeTest 
* Method: nativemethod 
* Signature: (Ljava/lang/String;)Z 
*/ 
JNIEXPORT jboolean JNICALL Java_NativeTest_nativemethod 
    (JNIEnv *, jclass, jstring); 

#ifdef __cplusplus 
} 
#endif 
#endif 

NativeTest.c

#include <jni.h> 
#include <windows.h> 
#include "NativeTest.h" 

JNIEXPORT jboolean JNICALL Java_NativeTest_nativemethod 
    (JNIEnv* Jenv, jclass Jref, jstring Jarg) 
    { 
    MessageBox(NULL, "text", "title", MB_OK); 
    int len = (*Jenv)->GetStringLength(Jenv, Jarg); 
    return (jboolean)(len > 5); 
    } 

D.EXEは: (gccのコマンドは、私はインターネット上で見つけた様々なコマンドの私の寄せ集めである。)

>javac NativeTest.java 

>javah -jni NativeTest 

>gcc -shared -I<jdk_dir>\include -I<jdk_dir>\include\win32 -oNativeTest.dll NativeTest.c -lgdi32 

>java -Djava.library.path=. NativeTest 
Exception on thread "main" java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(Ljava/lang/String;)Z 
     at NativeTest.nativemethod(Native Method) 
     at NativeTest.main(NativeTest.java:8) 

>java NativeTest 
Exception on thread "main" java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(Ljava/lang/String;)Z 
     at NativeTest.nativemethod(Native Method) 
     at NativeTest.main(NativeTest.java:8) 
+1

私はあなたのコードをよく見ていませんが、代わりにJNAを使用することを検討しましたか?それでは、JNIの不親切さを心配する必要はありません。 – rob

+0

JNAが存在するかどうかは知りませんでした。私はそれを調べます。ありがとう:) – nuju

+0

あなたのJavaコードで使用しているパッケージ名は何ですか? – ioums

答えて

4

いじり、その日の半分のために同じ問題を解決するためにグーグルの後、私が持っていますGCCは、JVMがシンボルを解決できるDLLを生成しないことを発見しました。しかし、GCCに正しいコマンドライン引数を渡すことができ、それは動作します:

this MinGWを参照してください。追加のフラグとして "-D_JNI_IMPLEMENTATION_ -Wl、 - kill-at"を渡す必要があります。それらのすべてが必要なのか、ちょうど最初のビットなのか分かりません。

+1

あなたは、より多くの注意を払う必要があります。私はそれを理解しようと半日も過ごしました。私があなたの答えを見たときに、それについて同様の質問をしようとしていた。 –

関連する問題