0

javah を使用するライブラリを構築しようとしているときに、クラスパスの問題に遭遇しました。どうやら、クラスパスには JDK パスが前に付いているようです。最終的な検索パスが間違っていることに注意してください。代わりにどうすればいいですか?

elmarco@makai:~/src/sasl/java/CyrusSasl (mingw32 *%)$ CLASSPATH=$PWD javah -o javasasl.h -jni -verbose Sasl 
error: cannot access Sasl
class file for Sasl not found
javadoc: error - Class Sasl not found.
[ Search Path: /usr/java/jdk1.6.0_24/jre/lib/resources.jar:/usr/java/jdk1.6.0_24/jre/lib/rt.jar:/usr/java/jdk1.6.0_24/jre/lib/sunrsasign.jar:/usr/java/jdk1.6.0_24/jre/lib/jsse.jar:/usr/java/jdk1.6.0_24/jre/lib/jce.jar:/usr/java/jdk1.6.0_24/jre/lib/charsets.jar:/usr/java/jdk1.6.0_24/jre/lib/modules/jdk.boot.jar:/usr/java/jdk1.6.0_24/jre/classes//home/elmarco/src/sasl/java/CyrusSasl ]
elmarco@makai:~/src/sasl/java/CyrusSasl (mingw32 *%)$ ls Sasl.java 
Sasl.java

ご協力いただきありがとうございます!

(これは Fedora 14 の jdk1.6.0_24 です)

4

3 に答える 3

1

javah実際のクラスパスを出力する方法の単なるバグだと思います。何が起こるかというと、組み込みクラスを検索する場所がたくさんあり、それらとは別に、 内のものも使用し$CLASSPATHます。使用されている実際のクラスパスを出力すると、次のような処理が行われます (疑似コード。implicitEntriesは組み込みクラスパス エントリexplicitEntriesのリストであり、 は で指定されたディレクトリのリストであると仮定します$CLASSPATH)。

print implicitEntries.join(pathSeparator) + explicitEntries.join(pathSeparator)

あるべき場所

print implicitEntries.join(pathSeparator) + pathSeparator + explicitEntries.join(pathSeparator)

以下は私にとってはうまくいきます:

$ ls
Sasl.class  Sasl.java
$ javah -classpath . -o javasasl.h -jni -verbose Sasl     [ Search Path: /usr/java/jdk1.6.0/jre/lib/resources.jar:/usr/java/jdk1.6.0/jre/lib/rt.jar:/usr/java/jdk1.6.0/jre/lib/sunrsasign.jar:/usr/java/jdk1.6.0/jre/lib/jsse.jar:/usr/java/jdk1.6.0/jre/lib/jce.jar:/usr/java/jdk1.6.0/jre/lib/charsets.jar:/usr/java/jdk1.6.0/jre/classes/. ]
[Creating file javasasl.h]
[search path for source files: [.]]
[search path for class files: [/usr/java/jdk1.6.0/jre/lib/resources.jar, /usr/java/jdk1.6.0/jre/lib/rt.jar, /usr/java/jdk1.6.0/jre/lib/sunrsasign.jar, /usr/java/jdk1.6.0/jre/lib/jsse.jar, /usr/java/jdk1.6.0/jre/lib/jce.jar, /usr/java/jdk1.6.0/jre/lib/charsets.jar, /usr/java/jdk1.6.0/jre/classes, /usr/java/jdk1.6.0/jre/lib/ext/dnsns.jar, /usr/java/jdk1.6.0/jre/lib/ext/localedata.jar, /usr/java/jdk1.6.0/jre/lib/ext/sunpkcs11.jar, /usr/java/jdk1.6.0/jre/lib/ext/sunjce_provider.jar, .]]
[loading ./Sasl.class]
[loading /usr/java/jdk1.6.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]
[loading /usr/java/jdk1.6.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Throwable.class)]
[loading /usr/java/jdk1.6.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Class.class)]
[done in 585 ms]
$ ls
javasasl.h  Sasl.class  Sasl.java

さて、ヘッダー ファイルの生成が機能していないようです...Sasl.class現在のディレクトリにあるのは確かですか? javahJava ソース ファイルではなく、バイト コード ファイルで動作します。

于 2011-03-24T13:30:51.343 に答える
1

私は通常、CLASSPATH環境変数を避けます。これはうまくいくはずです(おそらく問題なく):

javah -classpath .;<your-path> -o javasasl.h -jni -verbose Sasl

-classpathローカル パスだけが必要な場合は、オプションを指定する必要はありません.。これが既定値です。

-最初にコンパイルする必要があります。 クラスファイルが必要です。(入門)Sasl.javajavah

于 2011-03-24T13:23:37.077 に答える
1

ソースファイルが利用可能であることをここに示します...

(mingw32 *%)$ ls Sasl.java 
Sasl.java

しかし、クラス ファイル (Sasl.class) がありません。

error: cannot access Sasl
class file for Sasl not found

最初にコンパイルします。

于 2011-03-24T13:40:13.667 に答える