Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call a method in DLL in a Java program

I am trying to call a method in a DLL using JNA. So far have loaded the DLL using

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

This dll contaings a method that I need to access. How can I execute the method present in DLL in my Java file. Do I create an object or something of the DLL and then get the method name after the dot operator.

like image 967
Vivek Avatar asked Aug 22 '14 19:08

Vivek


People also ask

How do you call a DLL in Java?

To use an arbitrary DLL from Java you usually have to create an adapting DLL with the conventions of JNI that itself loads the "target" DLL and calls the required functions. To generate the correct headers for your adapter DLL you can use the tool javah shipped with the JDK.

How can we call external DLL method from Java program?

You will need to use the Java Native Interface (JNI), which is a set of C/C++ functions that allow native code to interface with java code (i.e. receiving parameters from java function calls, returning results, etc). Write a wrapper C library that receive JNI calls and then call your external library.

What is a DLL in Java?

Dynamic Link Library (DLL) is Microsoft's implementation of the shared library concept. A DLL file contains code and data that can be used by multiple programs at the same time, hence it promotes code reuse and modularization. This brief tutorial provides an overview of Windows DLL along with its usage.

Can you write DLL in Java?

Yes, it is possible to generate DLLs from Java source code.


1 Answers

From the 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);      } } 
like image 106
Rahul Tripathi Avatar answered Oct 07 '22 12:10

Rahul Tripathi