variable una otra misma metodo mandar llamar desde como clase boton java dll jni jna

una - Cómo llamar a un método en DLL en un programa Java



llamar variable de otra clase java (2)

Estoy intentando llamar a un método en una DLL usando JNA. Hasta ahora ha cargado la DLL usando

Runtime.getRuntime().load("myworkspace/test.dll");

Este dll contiene un método al que necesito acceder. ¿Cómo puedo ejecutar el método presente en DLL en mi archivo Java? ¿Creo un objeto o algo de la DLL y luego obtengo el nombre del método después del operador de punto?


Cargar la DLL es solo el paso más fácil.

Como no es realmente trivial llamar a un método de una DLL desde Java, esta respuesta es solo un resumen de sugerencias de lo que debe hacer para llamar a una función desde una DLL. Toda la historia llenaría un libro. Y, de hecho, hay varios libros sobre JNI (Java Native Interface).

Para invocar una función en una biblioteca nativa, debe declarar que un método en su clase Java es nativo con la palabra clave java native . La declaración de este método no debe tener un cuerpo.

El nombre de la función exportada desde su archivo DLL debe coincidir con el siguiente patrón: Java_classname_methodname donde classname es el nombre de la clase en la que declaró el método nativo methodname .

Por ejemplo, si declara un método nativo private native void sayHello() en su clase MyClass, el nombre de la función del DLL sería: Java_MyClass_sayHello

Tenga en cuenta también que la función debe exportarse desde el DLL con las convenciones de llamada correctas JNIEXPORT y JNICALL que se definen en el archivo de encabezado jni.h que viene con su JDK (consulte la carpeta de inclusión)

Todas las funciones de una DLL para llamar desde Java también deben tener dos argumentos "ocultos" como primeros parámetros (JNIEnv *env, jobject obj) . env es un puntero a la JVM llamante que le permite realizar una devolución de llamada en la JVM y obj es el objeto desde el que se obj el método.

Entonces, la definición completa del método de la DLL en nuestro ejemplo sería: JNIEXPORT void JNICALL Java_MyClass_sayHello(JNIEnv *, jobject);

Debido a estas restricciones de JNI, una DLL llamada desde su código debe ser hecha específicamente para su código. Para usar una DLL arbitraria de Java, generalmente tiene que crear una DLL de adaptación con las convenciones de JNI que carga el DLL de "destino" y llama a las funciones requeridas.

Para generar los encabezados correctos para su DLL de adaptador, puede usar la herramienta javah enviada con el JDK. Esta herramienta generará los encabezados que se implementarán a partir de su código Java.

Para obtener más información, la documentación de JNI cubrirá todas las preguntas sobre la interacción con la JVM desde el código nativo. http://docs.oracle.com/javase/7/docs/technotes/guides/jni/


De la source :

package jnahelloworldtest; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.NativeLong; import com.sun.jna.Platform; import com.sun.jna.*; /** Simple example of native library declaration and usage. */ public class Main { public interface simpleDLL extends Library { simpleDLL INSTANCE = (simpleDLL) Native.loadLibrary( (Platform.isWindows() ? "simpleDLL" : "simpleDLLLinuxPort"), simpleDLL.class); // it''s possible to check the platform on which program runs, for example purposes we assume that there''s a linux port of the library (it''s not attached to the downloadable project) byte giveVoidPtrGetChar(Pointer param); // char giveVoidPtrGetChar(void* param); int giveVoidPtrGetInt(Pointer param); //int giveVoidPtrGetInt(void* param); int giveIntGetInt(int a); // int giveIntGetInt(int a); void simpleCall(); // void simpleCall(); } public static void main(String[] args) { simpleDLL sdll = simpleDLL.INSTANCE; sdll.simpleCall(); // call of void function int a = 3; int result1 = sdll.giveIntGetInt(a); // calling function with int parameter&result System.out.println("giveIntGetInt("+a+"): " + result1); String testStr = "ToBeOrNotToBe"; Memory mTest = new Memory(testStr.length()+1); // ''+1'' remember about extra byte for /0 character! mTest.setString(0, testStr); String testReturn = mTest.getString(0); // you can see that String got properly stored in Memory object System.out.println("String in Memory:"+testReturn); Memory intMem = new Memory(4); // allocating space intMem.setInt(0, 666); // setting allocated memory to an integer Pointer intPointer = intMem.getPointer(0); int int1 = sdll.giveVoidPtrGetInt(Pointer.NULL); // passing null, getting default result System.out.println("giveVoidPtrGetInt(null):" + int1); int int2 = sdll.giveVoidPtrGetInt(intMem); // passing int stored in Memory object, getting it back //int int2 = sdll.giveVoidPtrGetInt(intPointer); causes JVM crash, use memory object directly! System.out.println("giveVoidPtrGetInt(666):" + int2); byte char1 = sdll.giveVoidPtrGetChar(Pointer.NULL); // passing null, getting default result byte char2 = sdll.giveVoidPtrGetChar(mTest); // passing string stored in Memory object, getting first letter System.out.println("giveVoidPtrGetChar(null):" + (char)char1); System.out.println("giveVoidPtrGetChar(''ToBeOrNotToBe''):" + (char)char2); } }