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
`