web-dev-qa-db-ja.com

JNIで使用中のJavahエラー

コマンド:

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エラーが発生しています。

これに対する解決策は非常に役立ちます。

43
krishnakumar

試して

javah -jni com.example.JavaHowTo

ここで、com.exampleはパッケージです。

また、com/example/JavaHowTo.classを含むディレクトリからjavahを実行する必要があります

例えばあなたの構造が

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

からjavahを実行する

/home/user
81
Glen

次は私のために働いた(Win7):

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

これをアプリのメインディレクトリから実行します。

問題はサブディレクトリにありましたclasses

13
jankos

次のオプションを使用して、ビルドスクリプトから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エラーも発生するのは非常に驚きです...

11
dilig0

同じエラーが発生し、 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ワークスペースのパスです。

これがあなたを助けることを願っています

9

--classpathにsourceディレクトリを追加すると、この問題が発生しました。クラスは* .Javaファイルにあると思った;)

Javahはバイトコードで動作しているため、バイナリを含むディレクトリをクラスパスに追加する必要があります

Eclipseタスクをいくつか作成しました。

"ロケーション"

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

「引数」

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

ファイルを選択して実行

4
Konrad Nowicki

Eclipseを使用しています。

コマンド構文:

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

outputdir-ヘッダーファイルが生成されるディレクトリ。

classpath-ルートパッケージを含むディレクトリへの絶対パスが含まれます。

fully_qualified_class-ネイティブメソッドを含まないクラスの名前.class拡張子

次のファイルが生成されます。

C:\ Users\John\workspace\JNITest\bin\com\canessa\john\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
user5948557

私の場合、問題はかなり愚かだった..私は試します:javah com.aaa.bbb.ClassName. class

「.class」なしで.hファイルを正しく生成します

javah com.aaa.bbb.ClassName

3
Marco McRoni

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は、2つの部分に分けて表示する必要があります...

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

クラスファイルの作成

以下の2行目は、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"

ヘッダーファイルの作成

以下の2行目は、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
Scott Izu

同様の問題があり、-verboseオプションを使用しました。を追加する必要がありました。クラスパスオプションの前に。

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\classes\c:\ projects\HellowWorld\build\classes

上記の例により、ここまで到達できました。

2
Jon

それは私と一緒に働いた:
ウィンドウの場合:
パスファイル.classの場合:D:\ workspace\JNI Demo\build\classes\jni\demoおよびNetbeans havaパッケージの場合:jni.demo.HelloWorld.Java
まず、.Javaファイルを.classファイルに組み込みます。
パスファイル.class:D:\ workspace\JNI Demo\build\classes\jni\demo\HelloWorld.class
次に、I dir D:\ workspace\JNI Demo\build\classes
そしてjavah -jni jni.demo.HelloWorld
最後に、パスに作成されたファイル結果.j:D:\ workspace\JNI Demo\build\classes

1
Hoang Thai

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を指定できます
  • しかし、MS-Windows上のjavahはパスを優先しますàlaC:\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
    
1
olibre

Cmd Windowsコマンドラインを使用して、Javaプロジェクトの「bin」ディレクトリに移動します。

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

次に、

javah "Your Package"."Name Of Your Java Class"
0
Max Dy

次は私のために働いた...ターミナルのようなプロジェクトパスに行く、

/ 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

0
Sarang.C
「javah」を使用して「Androidクラス」ファイルから「JNIヘッダー」ファイルを生成する方法(「.Java」または「.class」の両方が同様に機能します)。
Windows上のEclipseプロジェクトの場合:
src、bin、およびjniフォルダーがあるディレクトリに移動します(したがって、srcまたはbinおよびjniへの相対パスを使用できます): cd C:\ Android\workspace5\AndroidImageFilter 「javah」が「PATH」にあると仮定します(「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 ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | Android:targetSdkVersion = "16" ---------------------------- + | | | | | | | | | | | | | | | | | | | | | | | Android.jarへのパス--------- + ----------------------------- ---------- + | | | | | | | | | | | | | | | | | | | | | | | | セミコロン(;)重要! -------------------------------------------------- + | | | | | | | | | | ソースディレクトリを使用できます(できます!)(または/ bin/classes/dir)----- + | | | | | | | | 出力ファイルを置く場所(この場合はcn_Ragnarok_NativeFilterFunc.h)----------- + --- + | | | | ドット(。)は、.Javaソースファイルへの完全なパッケージ名パスをファイル名付きで作成-------- + | | ファイル名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を使用している場合、「;」ではなく「:」(コロン)を使用して、クラスパスのディレクトリを区切ります。
参照を参照してください http://docs.Oracle.com/javase/1.5.0/docs/tooldocs/windows/javah.html

0
Jon Goodwin