/// @param p1 some parameter
/// @param p2 some parameter
/// @param p3 some parameter
/// @param p4 Boolean some parameter
/// @return 0 if function execution is OK, 1 otherwise
typedef int (*PTR_method1)(const char * p1, bool p2, const char * p3, bool& p4);
/// This is method2
/// @param pA some parameter
/// @param pB some parameter
/// @param pC some parameter
/// @param pD some parameter
/// @param pE some parameter value can be 'E1' or 'E2' only
/// @param pF some parameter Can be eg. 'F1', 'F2' or 'F3'
/// @param pG some parameter Can be eg. 'G1' or G2'
/// @return 0 if function execution is OK, 1 otherwise
typedef int (*PTR_method2)(const char * pA, const char * pB, const char * pC, const char * pD, const char * pE, const char * pF, const char * pG);
}
When running the following Java code on Windows machine -
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
public class Test {
public interface CLibrary extends Library {
CLibrary INSTANCE = Native.load("myDLL.dll", CLibrary.class);
int method1(String input1, boolean input2, String input3, WinDef.BOOLByReference input4);
int method2(String inputA, String inputB, String inputC, String inputD, String inputE, String inputF, String inputG);
}
public static void main(String[] args) {
CLibrary library = CLibrary.INSTANCE;
int result1 = library.method1("val1", true, "val3", new WinDef.BOOLByReference());
System.out.println("result1: " + (result1 == 0));
int result2 = library.method2("valA", "valB", "valC", "valD", "valE", "valF", "valG");
System.out.println("result2: " + (result2 == 0));
}}
The output of the above code -
result1: true
Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokeInt(Native method)
at com.sun.jna.Function.invoke(Function.java:426)
at com.sun.jna.Function.invoke(Function.java:361)
at com.sun.jna.Library$Handler.invoke(Library.java:265)
at com.sun.proxy.$Proxy0.method2(Unknown source)
at Test.main(Test.java:19)
Any reason why?