Подтвердить что ты не робот

Ошибка инструмента Javah: не удалось найти файл класса для hellojni

Я пытаюсь создать заголовочный файл с помощью инструмента javah из командной строки в ОС Windows 7, но я все время терпеть неудачу.

Я пошел по-разному и даже прочитал документацию инструмента javah от oracle, но они не помогли преодолеть эту проблему.

Мой файл класса (hellojni.class) и java файл (hellojni.java) оба находятся в корневом каталоге диска D:\.

Но всякий раз, когда я запускаю инструмент javah, он дает мне ошибку:

не удалось найти файл класса для hellojni

Я попробовал, предоставляя classpath, но не получая никакого файла заголовка.

4b9b3361

Ответ 1

Я подозреваю, что проблема заключается в том, что у вашего класса есть пакет, и вы пытаетесь запустить команду из каталога с файлом класса вместо корня пакета.

Пример 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

Успех!

Ответ 2

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

Ответ 3

Предположим, что ваш файл класса находится в папке D:/A cd введите команду в папку A и запустите команду

D:/A > javah -classpath. classfilename

Здесь . задает путь к текущему каталогу, и инструмент javah должен иметь возможность находить ваш файл класса.

Ответ 4

В MacOS X требуется переменная classpath. Это может быть решением, если оно может быть проверено и на других платформах.

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

Ответ 5

Если вы используете eclipse: append -classpath PATH_OF_PACKAGE_TOP в javah CLASSNAME

Пример: javah -classpath . com.byf.test.JNI

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


result:`
    [email protected]:~/code/workspace_eclipse_java/JAVA_YF/src$ javah -classpath . com.byf.test.JNI
    [email protected]:~/code/workspace_eclipse_java/JAVA_YF/src$ ls
    com  com_byf_test_JNI.h  libcall.so
    [email protected]:~/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
    `

Ответ 6

Я также столкнулся с той же проблемой при попытке скомпилировать и сгенерировать заголовок C/C++ в два этапа для реализации Java Native Interface (JNI) (я подозреваю, что именно это вы пытаетесь сделать из имен файлов). Для меня это решило объединение двух шагов в один с помощью следующей команды:

javac YOUR_CLASS_FILE_NAME.java -h .

Точка (.) Включает текущий путь. Эта команда может быть запущена только с Java 8.