Erro da ferramenta Javah: não foi possível encontrar o arquivo de class para hellojni

Eu estou tentando criar um arquivo de header usando a ferramenta javah da linha de comando no windows 7 OS, mas estou falhando o tempo todo.

Eu segui caminhos diferentes e até li a documentação da ferramenta javah da oracle, mas eles não ajudaram a superar esse problema.

Meu arquivo de class ( hellojni.class ) e arquivo java ( hellojni.java ) ambos estão na raiz da unidade D:\ .

Mas sempre que eu executo a ferramenta javah, isso me dá um erro:

não foi possível encontrar o arquivo de class para hellojni

Eu tentei, fornecendo classpath, mas não recebendo nenhum arquivo de header.

Eu suspeito que o problema é que sua class tem um pacote e você está tentando executar o comando do diretório com o arquivo de class em vez da raiz do pacote .

O exemplo de Samhain funciona porque o MyClass.java não contém nenhum pacote, enquanto eu suspeito que o seu faz.

Por exemplo, suponha que temos o seguinte arquivo em c:\src\com\example\MyClass.java

 package com.example; public class MyClass { public native void myMethod(); } 

Vá para a linha de comando e execute o seguinte:

 c:\src\com\example>javac MyClass.java c:\src\com\example>dir Directory of C:\src\com\example 2015-02-23 03:17 PM  . 2015-02-23 03:17 PM  .. 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  . 2015-02-23 03:18 PM  .. 2015-02-23 03:16 PM  com 2015-02-23 03:18 PM 449 com_example_MyClass.h 

Sucesso!

javah -classpath path_to_jars_or_classs com.my.package.MyClass .

Se você executar com -verbose, javah -verbose -classpath path_to_jars_or_classs com.my.package.MyClass , ele mostrará o caminho de pesquisa que está usando para localizar suas classs. Você pode usar isso para validar se o seu diretório, D: \, está listado.

Veja a documentação javah

Exemplo: o arquivo é chamado MyClass.java, o nome da class interna é MyClass. Sem erros.

 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 

Suponha que seu arquivo de class esteja na pasta D: / A cd seu prompt de comando para a pasta A e execute o comando abaixo

D: / A> javah -classpath. classfilename

Aqui irá definir o classpath para o diretório atual e a ferramenta javah deve ser capaz de encontrar o seu arquivo de class.

No MacOS X, é necessária a variável classpath. Essa pode ser a solução se puder ser verificada em outras plataformas também.

 $ javah -verbose Article.HelloJNICpp $ javah -verbose -classpath ./ Article.HelloJNICpp [Creating file RegularFileObject[Article_HelloJNICpp.h]] $ 

Se você estiver usando eclipse: append -classpath PATH_OF_PACKAGE_TOP em javah CLASSNAME

Exemplo: javah -classpath . com.byf.test.JNI 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  /* 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 `