Ошибка инструмента Javah: не удалось найти файл класса для hellojni
Я пытаюсь создать заголовочный файл с помощью инструмента javah из командной строки в ОС Windows 7, но я все время терпеть неудачу.
Я пошел по-разному и даже прочитал документацию инструмента javah от oracle, но они не помогли преодолеть эту проблему.
Мой файл класса (hellojni.class
) и java файл (hellojni.java
) оба находятся в корневом каталоге диска D:\
.
Но всякий раз, когда я запускаю инструмент javah, он дает мне ошибку:
не удалось найти файл класса для hellojni
Я попробовал, предоставляя classpath, но не получая никакого файла заголовка.
Ответы
Ответ 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.