Ошибка Javah при использовании его в JNI - PullRequest
44 голосов
/ 12 июня 2009

Команда:

javah -jni JavaHowTo

Результат:

error: cannot access JavaHowTo 
class file for JavaHowTo not found

javadoc: error - Class JavaHowTo not found.
Error: No classes were specified on the command line.  Try -help.

Я правильно установил путь к классу, но все равно получаю эту javah ошибку.

Любое решение для этого будет очень полезным.

Ответы [ 14 ]

81 голосов
/ 12 июня 2009

Попробуйте

javah -jni com.example.JavaHowTo

где com.example ваш пакет.

Вам также нужно запустить javah из каталога, содержащего com/example/JavaHowTo.class

например. если ваша структура

/home/user/com/example/JavaHowTo.class

запустить Джаву с

/home/user
13 голосов
/ 01 апреля 2012

У меня (Win7) сработало следующее:

javah -classpath bin/classes -jni -d jni com.my.javaclass

Я запускаю это из главного каталога приложения.

Проблема была в подкаталоге классы

11 голосов
/ 12 июня 2009

Я успешно использую javah каждый день из своих сценариев сборки со следующими параметрами:

javah -d <outputdir> -classpath <classpath> <fully_qualified_class>

где:

'outputdir' is the directory where to put the generated header file

'classpath' contains an absolute path to the directory containing your root package (as mentionned by Glen)

'fully_qualified_class' is the name of the class containing native methods without .class extension

опция -jni не требуется (устанавливается по умолчанию)

В любом случае вы должны проверить, что ваш файл класса был сгенерирован: довольно удивлен, что вы тоже получаете ошибку javadoc ...

9 голосов
/ 07 июня 2011

Я столкнулся с той же ошибкой и, используя ссылку http://www.inonit.com/cygwin/jni/helloWorld/header.html, смог успешно сгенерировать файл .h. Я использовал следующую команду

C:\Program Files\Java\jdk1.6.0_21\bin>javah -d C:\Prachi\Android\Workspace_QP_re
structure\HelloWorld\bin\example\jni -classpath C:\Prachi\Android\Workspace_QP_r
estructure\HelloWorld\bin example.jni.HelloWorld

здесь example.jni - это имя моего пакета, а C:\Prachi\Android\Workspace_QP_re structure\ - это путь к моей рабочей области затмения.

Надеюсь, это поможет вам

4 голосов
/ 21 декабря 2010

У меня была эта проблема, когда я добавлял в -classpath мой каталог source . Я думал, что классы находятся в * .java файлах;)

Javah работает с байтовым кодом, поэтому вам нужно добавить каталог с вашими двоичными файлами в classpath

Я сделал несколько заданий на затмение:

"Расположение"

${env_var:JAVA_HOME}\bin\javah.exe

"Аргументы"

-verbose 
-force
-classpath ;${project_loc}\bin
-d ${project_loc}\jni 
${java_type_name}

Выберите файл и запустите

3 голосов
/ 19 декабря 2016

Я использую Eclipse.

Синтаксис команды:

javah -d <outputdir> -classpath <classpath> <fully_qualified_class>

outputdir - Каталог, в котором создается файл заголовка.

classpath - содержит абсолютный путь к каталогу, содержащему корневой пакет.

fully_qualified_class - Имя класса, содержащего нативные методы БЕЗ .class расширение

Генерируется следующий файл:

C: \ Users \ John \ рабочее пространство \ JNITest \ Bin \ ком \ Canessa \ джон \ jnitest \ com_canessa_john_jnitest_CallMyCLib.h

Содержимое сгенерированного заголовочного файла:

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

#ifndef _Included_com_canessa_john_jnitest_CallMyCLib
#define _Included_com_canessa_john_jnitest_CallMyCLib
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_canessa_john_jnitest_CallMyCLib
 * Method:    helloInC
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_canessa_john_jnitest_CallMyCLib_helloInC
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
3 голосов
/ 29 декабря 2011

В моем случае проблема была довольно глупой .. Я попробую: javah com.aaa.bbb.ClassName. class

без ".class" Я правильно генерирую .h файл

javah com.aaa.bbb.ClassName

2 голосов
/ 10 августа 2013

для Windows ...

ФАЙЛЫ

javaFileName: HelloWorld.java
packageCode: "package com.accessibility;"
importCode: "import com.accessibility.HelloWorld;"
javaFileLocation: "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.java"

javaFileLocation следует рассматривать как состоящий из двух частей ...

classpath: "S:\Accessibility\tools\src\test\java"
relativeFilePath: "com\accessibility\HelloWorld.java"

СОЗДАТЬ ФАЙЛ КЛАССА

Вторая строка ниже была запущена из командной строки Windows.

{javacLocation} -d {ouputDirectory} {javaFileLocation}
"C:\Program Files\Java\jdk1.6.0_26\bin\javac.exe" -d "S:\Accessibility\tools\src\test\java" "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.java"

Это создало файл HelloWorld.class

classFileName: HelloWorld.class 
classFileLocation: "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.class"

СОЗДАТЬ ФАЙЛ ГОЛОВКИ

Вторая строка ниже была запущена из командной строки Windows.

{javahLocation} -o {outputFile} -classpath {classpath} {importName}
"C:\Program Files\Java\jdk1.6.0_26\bin\javah.exe" -o "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.h" -classpath "S:\Accessibility\tools\src\test\java" com.accessibility.HelloWorld

Создан файл HelloWorld.h

classFileName: HelloWorld.h
classFileLocation: "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.h"
2 голосов
/ 02 апреля 2012

У меня были похожие проблемы и я использовал опцию -verbose. Я должен был добавить; в начало опции classpath.

C:\Projects\HelloWorld\src>javah -verbose -classpath c:\projects\HellowWorld\build\classes helloworld.HelloWorld
error: cannot access helloworld.HelloWorld
class file for helloworld.HelloWorld not found
javadoc: error - Class helloworld.HelloWorld not found.
[ Search Path: c:\jdk\jre\lib\resources.jar;c:\jdk\jre\lib\rt.jar;c:\jdk\jre\lib    \sunrsasign.jar;c:\jdk\jre\lib\jsse.jar;c:\jdk\jre\lib\jce.jar;c:\jdk\jre\lib\ch    arsets.jar;c:\jdk\jre\classes\c:\projects\HellowWorld\build\classes ]
Error: No classes were specified on the command line.  Try -help.

C:\Projects\HelloWorld\src>javah -verbose -classpath ;c:\projects\HellowWorld\build\classes helloworld.HelloWorld
[ Search Path: c:\jdk\jre\lib\resources.jar;c:\jdk\jre\lib\rt.jar;c:\jdk\jre\lib\sunrsasign.jar;c:\jdk\jre\lib\jsse.jar;c:\jdk\jre\lib\jce.jar;c:\jdk\jre\lib\charsets.jar;c:\jdk\jre\classes\;c:\projects\HellowWorld\build\classes ]
[Creating file helloworld_HelloWorld.h]
[search path for source files: .,c:\projects\HellowWorld\build\classes]
[search path for class files: c:\jdk\jre\lib\resources.jar,c:\jdk\jre\lib\rt.jar,c:\jdk\jre\lib\sunrsasign.jar,c:\jdk\jre\lib\jsse.jar,c:\jdk\jre\lib\jce.jar,c:\jdk\jre\lib\charsets.jar,c:\jdk\jre\classes,c:\jdk\jre\lib\ext\dnsns.jar,c:\jdk\jre\lib\ext\localedata.jar,c:\jdk\jre\lib\ext\sunjce_provider.jar,c:\jdk\jre\lib\ext\sunmscapi.jar,c:\jdk\jre\lib\ext\sunpkcs11.jar,.,c:\projects\HellowWorld\build\classes]
[loading .\helloworld\HelloWorld.class]
[loading java\lang\Object.class(java\lang:Object.class)]
[loading java\lang\Throwable.class(java\lang:Throwable.class)]
[loading java\lang\Class.class(java\lang:Class.class)]
[done in 409 ms]

Без; это конец пути поиска: C: \ JDK \ JRE \ Классы \ C: \ Проекты \ HellowWorld \ построить \ классы

Мне удалось продвинуться так далеко благодаря приведенным выше примерам.

1 голос
/ 14 декабря 2015

Это сработало со мной:
Для окна:
Если путь к файлу .class: D: \ workspace \ JNI Demo \ build \ classes \ jni \ demo и в пакете hava Netbeans: jni.demo.HelloWorld.java
Сначала я помещаю файл .java в файл .class.
Путь к файлу .class: D: \ workspace \ JNI Demo \ build \ classes \ jni \ demo \ HelloWorld.class
Во-вторых, я D: \ workspace \ JNI Demo \ build \ classes
И javah -jni jni.demo.HelloWorld
Наконец, файл результата .j создан по пути: D: \ workspace \ JNI Demo \ build \ classes

...