Windows 7 OSのコマンドラインからjavahツールを使用してヘッダーファイルを作成しようとしていますが、常に失敗しています。
私はさまざまな方法に従い、Oracleのjavahツールのドキュメントを読みましたが、この問題を克服する助けにはなりませんでした。
クラスファイル(hellojni.class
)とJavaファイル(hellojni.Java
)は両方ともD:\
ドライブのルートにあります。
しかし、javahツールを実行するたびにエラーが発生します。
hellojniのクラスファイルが見つかりませんでした
クラスパスも提供してみましたが、ヘッダーファイルは取得しませんでした。
クラスにパッケージがあり、パッケージルートの代わりにクラスファイルを使用してディレクトリからコマンドを実行しようとしているであると思われます。
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
成功!
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
Java Native Interface(JNI)実装のための2つのステップでC/C++ヘッダーをコンパイルおよび生成しようとすると、同じ問題に直面しました(私はあなたがファイル名)。私にとってそれを解決したのは、次のコマンドを使用して2つのステップを1つにマージすることでした。
javac YOUR_CLASS_FILE_NAME.Java -h .
ドット(。)には現在のパスが含まれます。このコマンドは、Java 8。
クラスファイルがD:/ Aフォルダーにあると仮定します。cdコマンドでフォルダーAにプロンプトを表示し、以下のコマンドを実行します。
D:/ A> javah -classpath。クラスファイル名
ここに .
は、クラスパスを現在のディレクトリに設定し、javahツールはクラスファイルを見つけることができるはずです。
MacOS Xでは、クラスパス変数が必要でした。他のプラットフォームでも検証できる場合、これが解決策になる可能性があります。
$ javah -verbose Article.HelloJNICpp
$ javah -verbose -classpath ./ Article.HelloJNICpp
[Creating file RegularFileObject[Article_HelloJNICpp.h]]
$
Eclipseを使用している場合:-classpath PATH_OF_PACKAGE_TOPをjavah CLASSNAMEに追加します
例:javah -classpath . com.byf.test.JNI
my tree : `
.
├── com
│ └── byf
│ └── test
│ └── JNI.Java
└── libcall.so`
result:`
byf@byf-Ubuntu:~/code/workspace_Eclipse_Java/JAVA_YF/src$ javah -classpath . com.byf.test.JNI
byf@byf-Ubuntu:~/code/workspace_Eclipse_Java/JAVA_YF/src$ ls
com com_byf_test_JNI.h libcall.so
byf@byf-Ubuntu:~/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
`