コマンド:
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
エラーが発生しています。
これに対する解決策は非常に役立ちます。
試して
javah -jni com.example.JavaHowTo
ここで、com.example
はパッケージです。
また、com/example/JavaHowTo.class
を含むディレクトリからjavahを実行する必要があります
例えばあなたの構造が
/home/user/com/example/JavaHowTo.class
からjavahを実行する
/home/user
次は私のために働いた(Win7):
javah -classpath bin/classes -jni -d jni com.my.javaclass
これをアプリのメインディレクトリから実行します。
問題はサブディレクトリにありましたclasses
次のオプションを使用して、ビルドスクリプトから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エラーも発生するのは非常に驚きです...
同じエラーが発生し、 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ワークスペースのパスです。
これがあなたを助けることを願っています
--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}
ファイルを選択して実行
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
私の場合、問題はかなり愚かだった..私は試します:javah com.aaa.bbb.ClassName. class
「.class」なしで.hファイルを正しく生成します
javah com.aaa.bbb.ClassName
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"
同様の問題があり、-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
上記の例により、ここまで到達できました。
それは私と一緒に働いた:
ウィンドウの場合:
パスファイル.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
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
はパスを優先しますà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
Cmd Windowsコマンドラインを使用して、Javaプロジェクトの「bin」ディレクトリに移動します。
cd "Path to the bin directory of your Java project"
次に、
javah "Your Package"."Name Of Your Java Class"
次は私のために働いた...ターミナルのようなプロジェクトパスに行く、
/ 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
「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