tipos proyecto paquetes otro mis librerias importar funciones declaracion como clases java jni native-methods default-package

proyecto - paquetes de java y sus funciones



Cómo importar una clase del paquete predeterminado (9)

  1. Crea un nuevo paquete
  2. Mueva sus archivos del paquete predeterminado al nuevo.

Posible duplicado: ¿Cómo acceder a las clases de Java en el paquete predeterminado?

Estoy usando Eclipse 3.5 y he creado un proyecto con alguna estructura de paquete junto con el paquete predeterminado. Tengo una clase en el paquete predeterminado - Calculations.java y quiero hacer el uso de esa clase en cualquiera de los paquetes (por ejemplo en com.company.calc ). Cuando intento hacer uso de la clase que está en el paquete predeterminado, me está dando un error de compilación. No puede reconocer la clase en el paquete predeterminado. ¿Dónde está el problema?

Calculations.java - código fuente

public class Calculations { native public int Calculate(int contextId); native public double GetProgress(int contextId); static { System.loadLibrary("Calc"); } }

No puedo poner mi clase en ningún otro paquete. Esta clase tiene algunos métodos nativos que se implementan en Delphi. Si coloco esa clase en cualquiera de las carpetas, tendré que hacer cambios en esa DLL que quiero evitar (realmente, no puedo). Es por eso que puse mi clase en el paquete predeterminado.


  1. Cree el paquete "raíz" (carpeta) en su proyecto, por ejemplo.

    fuente del paquete; (... / path_to_project / source /)

  2. Mueva YourClass.class a una carpeta de origen. (... / path_to_project / source / YourClass.class)

  3. Importar de esta manera

    import source.YourClass;


Crear un paquete nuevo Y luego mover las clases del paquete predeterminado en un paquete nuevo y usar esas clases


De algunos donde encontré a continuación:

De hecho, puedes.

Usando Reflections API puedes acceder a cualquier clase hasta ahora. Al menos pude :)

Class fooClass = Class.forName("FooBar"); Method fooMethod = fooClass.getMethod("fooMethod", new Class[] { String.class }); String fooReturned = (String) fooMethod.invoke(fooClass.newInstance(), "I did it");


Desafortunadamente, no puedes importar una clase sin que esté en un paquete. Esta es una de las razones por las que es altamente desalentador. Lo que probaría es una especie de proxy: coloque su código en un paquete que todo puede usar, pero si realmente necesita algo en el paquete predeterminado, cree una clase muy simple que envíe llamadas a la clase con el código real. O, incluso más simple, solo haz que se extienda.

Para dar un ejemplo:

import my.packaged.DefaultClass; public class MyDefaultClass extends DefaultClass {}

package my.packaged.DefaultClass; public class DefaultClass { // Code here }


Desde la especificación de lenguaje Java :

Es un error de tiempo de compilación importar un tipo del paquete sin nombre.

Tendrás que acceder a la clase mediante reflexión o algún otro método indirecto.


Hay una solución para su problema. Puedes usar la reflexión para lograrlo.

Primero, crea una interfaz para tu clase objetivo Calculatons :

package mypackage; public interface CalculationsInterface { int Calculate(int contextId); double GetProgress(int contextId); }

Luego, haz que tu clase objetivo implemente esa interfaz:

public class Calculations implements mypackage.CalculationsInterface { @Override native public int Calculate(int contextId); @Override native public double GetProgress(int contextId); static { System.loadLibrary("Calc"); } }

Finalmente, utilice la reflexión para crear una instancia de la clase Calculations y asígnela a una variable de tipo CalculationsInterface :

Class<?> calcClass = Class.forName("Calculations"); CalculationsInterface api = (CalculationsInterface)calcClass.newInstance(); // Use it double res = api.GetProgress(10);


Las clases en el paquete predeterminado no se pueden importar por clases en paquetes. Es por eso que no deberías usar el paquete predeterminado.


Puedo darle esta sugerencia, por lo que sé de mi experiencia de programación en C y C ++, una vez, cuando tuve el mismo problema, lo resolví cambiando la estructura escrita dll en el archivo ".C" cambiando el nombre de la función que implementó la funcionalidad nativa de JNI. por ejemplo, si desea agregar su programa en el paquete "com.mipackage", puede cambiar el prototipo del JNI que implementa la función / método del archivo ".C" a este:

JNIEXPORT jint JNICALL Java_com_mypackage_Calculations_Calculate(JNIEnv *env, jobject obj, jint contextId) { //code goes here } JNIEXPORT jdouble JNICALL Java_com_mypackage_Calculations_GetProgress(JNIEnv *env, jobject obj, jint contextId) { //code goes here }

Como soy nuevo en Delphi, no puedo garantizarlo, pero finalmente diré esto (aprendí algunas cosas después de buscar en Google sobre Delphi y JNI): pregunta a esas personas (si no eres el único) que proporcionaron la implementación Delphi del idioma nativo. código para cambiar los nombres de las funciones a algo como esto:

function Java_com_mypackage_Calculations_Calculate(PEnv: PJNIEnv; Obj: JObject; contextId: JInt):JInt; {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF} var //Any variables you might be interested in begin //Some code goes here end; function Java_com_mypackage_Calculations_GetProgress(PEnv: PJNIEnv; Obj: JObject; contextId: JInt):JDouble; {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF} var //Any variables you might be interested in begin //Some code goes here end;

Pero, un consejo final: aunque usted (si es el programador de Delphi) o ellos cambiarán los prototipos de estas funciones y volverán a compilar el archivo dll, una vez que el archivo dll esté compilado, no podrá cambiar el nombre del paquete de su Archivo "Java" una y otra vez. Porque, nuevamente, esto requerirá que usted o ellos cambien los prototipos de las funciones en delphi con los prefijos cambiados (por ejemplo, JAVA_yourpackage_with_underscores_for_inner_packages_JavaFileName_MethodName)

Creo que esto resuelve el problema. Gracias y saludos, Harshal Malshe