significado ejemplos java jni javah

ejemplos - Error de la herramienta Javah: no se pudo encontrar el archivo de clase para hellojni



javah significado (5)

Estoy intentando crear un archivo de cabecera usando la herramienta javah desde la línea de comandos en el sistema operativo Windows 7, pero estoy fallando todo el tiempo.

He seguido diferentes caminos e incluso he leído la documentación de la herramienta javah de Oracle, pero no han ayudado a superar este problema.

Mi archivo de clase ( hellojni.class ) y el archivo java ( hellojni.java ) están en la raíz de D:/ unidad.

Pero siempre que ejecuto la herramienta javah me da un error:

no pudo encontrar el archivo de clase para hellojni

Intenté proporcionando classpath también, pero no obtengo ningún archivo de encabezado.


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

Si ejecuta con javah -verbose -classpath path_to_jars_or_classes com.my.package.MyClass , javah -verbose -classpath path_to_jars_or_classes com.my.package.MyClass , le mostrará la ruta de búsqueda que está utilizando para ubicar sus clases. Puede usar eso para validar si su directorio, D: /, está en la lista.

Ver la documentación de javah

Ejemplo: El archivo se llama MyClass.java, el nombre de clase interno es MyClass. Sin errores.

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


Supongamos que su archivo de clase está en D: / Una carpeta, haga clic en el símbolo del sistema en la carpeta A y ejecute el comando debajo.

D: / A> javah-classpath. classfilename

Aquí . configurará el classpath al directorio actual y la herramienta javah debería poder encontrar su archivo de clase.


Sospecho que el problema es que su clase tiene un paquete y está intentando ejecutar el comando desde el directorio con el archivo de clase en lugar del directorio raíz del paquete .

El ejemplo de Samhain funciona porque su MyClass.java no contiene ningún paquete, mientras que sospecho que el tuyo sí.

Por ejemplo, supongamos que tenemos el siguiente archivo en c:/src/com/example/MyClass.java

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

Vaya a la línea de comando y ejecute lo siguiente:

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

¡Éxito!


En MacOS X, requería la variable classpath. Esta podría ser la solución si también se puede verificar en otras plataformas.

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


Si está utilizando eclipse: añada -classpath PATH_OF_PACKAGE_TOP a javah CLASSNAME

Ejemplo: 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 <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 `