web-dev-qa-db-ja.com

Javahツールエラー:hellojniのクラスファイルが見つかりませんでした

Windows 7 OSのコマンドラインからjavahツールを使用してヘッダーファイルを作成しようとしていますが、常に失敗しています。

私はさまざまな方法に従い、Oracleのjavahツールのドキュメントを読みましたが、この問題を克服する助けにはなりませんでした。

クラスファイル(hellojni.class)とJavaファイル(hellojni.Java)は両方ともD:\ドライブのルートにあります。

しかし、javahツールを実行するたびにエラーが発生します。

hellojniのクラスファイルが見つかりませんでした

クラスパスも提供してみましたが、ヘッダーファイルは取得しませんでした。

31
S.S Sahota

クラスにパッケージがあり、パッケージルートの代わりにクラスファイルを使用してディレクトリからコマンドを実行しようとしているであると思われます。

Samhainの例は、彼のMyClass.Javaにパッケージが含まれていないので機能しますが、あなたのパッケージには含まれていると思われます。

たとえば、c:\src\com\example\MyClass.Javaに次のファイルがあるとします

package com.example;

public class MyClass {
    public native void myMethod();
}

コマンドラインに移動して、次を実行します。

c:\src\com\example>javac MyClass.Java

c:\src\com\example>dir

 Directory of C:\src\com\example

2015-02-23  03:17 PM    <DIR>          .
2015-02-23  03:17 PM    <DIR>          ..
2015-02-23  03:20 PM               219 MyClass.class
2015-02-23  03:17 PM                84 MyClass.Java

c:\src\com\example>javah MyClass
Error: Could not find class file for 'MyClass'.

c:\src\com\example>cd c:\src

c:\src>javah com.example.MyClass

c:\src>dir
 Directory of C:\src

2015-02-23  03:18 PM    <DIR>          .
2015-02-23  03:18 PM    <DIR>          ..
2015-02-23  03:16 PM    <DIR>          com
2015-02-23  03:18 PM               449 com_example_MyClass.h

成功!

102
hendalst

javah -classpath path_to_jars_or_classes com.my.package.MyClass

-verboseを指定して実行すると、javah -verbose -classpath path_to_jars_or_classes com.my.package.MyClass、クラスの検索に使用している検索パスが表示されます。これを使用して、ディレクトリD:\がリストされているかどうかを検証できます。

javahドキュメント を参照してください

例:ファイルの名前はMyClass.Java、内部クラス名はMyClassです。エラーなし。

C:\>more MyClass.Java
public class MyClass
{
   public static void doSomething(int b)
   {
      return;
   }
}

C:\>javac MyClass.Java

C:\>javah -classpath C:\ MyClass

C:\>dir *.h
 Volume in drive C has no label.
 Volume Serial Number is XXXX-XXXX

 Directory of C:\

10/07/2013  11:46 AM               242 MyClass.h
               1 File(s)            242 bytes
               0 Dir(s)  X bytes free
8
Samhain

Java Native Interface(JNI)実装のための2つのステップでC/C++ヘッダーをコンパイルおよび生成しようとすると、同じ問題に直面しました(私はあなたがファイル名)。私にとってそれを解決したのは、次のコマンドを使用して2つのステップを1つにマージすることでした。

javac YOUR_CLASS_FILE_NAME.Java -h .

ドット(。)には現在のパスが含まれます。このコマンドは、Java 8。

2
Abdel Aleem

クラスファイルがD:/ Aフォルダーにあると仮定します。cdコマンドでフォルダーAにプロンプ​​トを表示し、以下のコマンドを実行します。

D:/ A> javah -classpath。クラスファイル名

ここに .は、クラスパスを現在のディレクトリに設定し、javahツールはクラスファイルを見つけることができるはずです。

1
Pratap Singh

MacOS Xでは、クラスパス変数が必要でした。他のプラットフォームでも検証できる場合、これが解決策になる可能性があります。

$ javah -verbose Article.HelloJNICpp
$ javah -verbose -classpath ./ Article.HelloJNICpp
[Creating file RegularFileObject[Article_HelloJNICpp.h]]
$ 
1
Rock

Eclipseを使用している場合:-classpath PATH_OF_PACKAGE_TOPをjavah CLASSNAMEに追加します

例:javah -classpath . com.byf.test.JNI

my tree : `
.
├── com
│   └── byf
│       └── test
│           └── JNI.Java
└── libcall.so`


result:`
    byf@byf-Ubuntu:~/code/workspace_Eclipse_Java/JAVA_YF/src$ javah -classpath . com.byf.test.JNI
    byf@byf-Ubuntu:~/code/workspace_Eclipse_Java/JAVA_YF/src$ ls
    com  com_byf_test_JNI.h  libcall.so
    byf@byf-Ubuntu:~/code/workspace_Eclipse_Java/JAVA_YF/src$ cat com_byf_test_JNI.h 
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_byf_test_JNI */

    #ifndef _Included_com_byf_test_JNI
    #define _Included_com_byf_test_JNI
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_byf_test_JNI
     * Method:    add
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_com_byf_test_JNI_add
      (JNIEnv *, jclass, jint, jint);

    #ifdef __cplusplus
    }
    #endif
    #endif
    `
1
Riven666666666