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

Ошибка Javah при использовании в JNI

Команда:

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.

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

4b9b3361

Ответ 1

Try

javah -jni com.example.JavaHowTo

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

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

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

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

запустить javah из

/home/user

Ответ 2

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

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

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

Проблема заключалась в подкаталоге classes

Ответ 3

Я успешно использую 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...

Ответ 4

Я столкнулся с той же ошибкой и с помощью 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\ - это путь моей рабочей области eclipse.

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

Ответ 5

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

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

Я сделал некоторую задачу затмения:

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

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

"Аргументы"

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

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

Ответ 6

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

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

javah com.aaa.bbb.ClassName

Ответ 7

У меня были похожие проблемы и я использовал опцию -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\построить\классы

Я смог зайти так далеко из приведенных выше примеров.

Ответ 8

Для 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"

CREATE CLASS FILE

Вторая строка, приведенная ниже, запускалась из командной строки 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"

Ответ 9

проблема с Cygwin:

javah не работает должным образом с терминала Cygwin:

$ cd /cygdrive/c/Workspace/prj/bin
$ ls com/example/JavaHotTo.class
com/example/JavaHotTo.class
$ javah com.example.JavaHowTo
Error: Could not find class file for 'com.example.JavaHowTo'.

Но он отлично работает, используя опцию -classpath .

$ javah -classpath . com.example.JavaHowTo
$ ls *.h
com_example_JavaHotTo.h

Больше трюков:

  • По умолчанию опция -jni по умолчанию, поэтому она не требуется.
  • Вы можете указать относительный/абсолютный classpath
  • Но javah на MS-Windows предпочитает путь à la C:\Workspace\prj\bin
  • Используйте cygpath -w /cygdrive/c/Workspace/prj/bin для преобразования в формат MS-Windows
  • Используйте опцию -d your/jni/headers/path для записи заголовков в другой каталог
  • javah создает путь your/jni/headers/path, если он не существует (см. ниже)

    $ javah -d jni/headers -classpath . com.example.JavaHowTo
    $ ls       jni\headers
    com_example_JavaHotTo.h
    $ javah -d jni\path -classpath . com.example.JavaHowTo
    $ ls       jni\path
    com_example_JavaHotTo.h
    

Ответ 10

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

Ответ 11

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

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

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

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

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

fully_qualified_class - Имя класса, содержащего встроенные методы WITHOUT .class extension

Создается следующий файл:

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

Ответ 12

Перейдите в свою папку "bin" вашего проекта Java через командную строку командной строки cmd.

cd "Path to the bin directory of your java project"

Затем

javah "Your Package"."Name Of Your Java Class"

Ответ 13

После меня работали... Перейдите к пути к проекту с терминала, например,

/home/usr/Desktop/Workspace/ProjectName/src/main/java

и нажмите следующую команду,

javah -jni com.abc.test.callfileName (без расширения .class)

com_abc_test_className.h файл будет создан в следующем пути /home/usr/Desktop/Workspace/ProjectName/src/main/java

наконец команда выглядит, [my-machine/usr] $/home/usr/Desktop/Workspace/ProjectName/src/main/java/src/main/java > javah -jni com.abc.test.className

Ответ 14

How to generate a `JNI Header` file from an `Android class` file using `javah` (`.java` or `.class` BOTH work equally well).
For Eclipse project on Windows:
Goto the directory where the src, bin and jni folders are (so we can use relative paths to src or bin and jni): cd C:\Android\workspace5\AndroidImageFilter I assume `javah` is in your `PATH` (It is in something like : `C:\Program Files\Java\jdk1.7.0_79\bin\javah.exe`): javah -classpath c:\Android\sdk\platforms\android-19\android.jar;./src/ -d ./jni cn.Ragnarok.NativeFilterFunc ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | Your android:targetSdkVersion="16"----------------------------+ | | | | | | | | | | | | | | | | | | | | | | | path to android.jar ---------+---------------------------------------+ | | | | | | | | | | | | | | | | | | | | | | | | semicolon (;) important ! --------------------------------------------------+ | | | | | | | | | | You can use the source directory (yes you can !) (OR the /bin/classes/ dir)-----+ | | | | | | | | Where to put the output file (cn_Ragnarok_NativeFilterFunc.h in this case)-----------+---+ | | | | The dot (.) spearated full package name path to the .java source file WITH file name --------+ | | File name of a java class -------------------------------------------------------------------------------------+ For Android Studio on Windows e'g': ^ cd C:\Android\workspace5\AndroidImageFilter\app\src\main | and usr java INSTEAD of src ----------------------------------------------------+

Подробнее см. http://kn-gloryo.github.io/Build_NDK_AndroidStudio_detail/.

Если у вас много имен файлов (классов Java), вы можете использовать файл со списком классов.
Если вы находитесь в Linux или MAC-OS, используйте ":" (двоеточие), чтобы разделить каталоги для pathpath, а не ";"
См. Ссылку http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javah.html