lwahonen@35acd04
See above commit for a minimal unit test.
It fails with
java.lang.IllegalArgumentException: Structure field "callback" was declared as interface com.sun.jna.CallbacksTest$vTable$functionpointer, which is not supported within a Structure
at com.sun.jna.Structure.writeField(Structure.java:864)
at com.sun.jna.Structure.write(Structure.java:768)
at com.sun.jna.CallbacksTest.testWriteCallback(CallbacksTest.java:1577)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.IllegalArgumentException: Exception thrown while instantiating an instance of class com.sun.jna.platform.win32.OaIdl$SAFEARRAY
at com.sun.jna.Structure.newInstance(Structure.java:1790)
at com.sun.jna.Structure.validate(Structure.java:2128)
at com.sun.jna.CallbackReference.getNativeType(CallbackReference.java:275)
at com.sun.jna.CallbackReference.(CallbackReference.java:248)
at com.sun.jna.CallbackReference.getFunctionPointer(CallbackReference.java:449)
at com.sun.jna.CallbackReference.getFunctionPointer(CallbackReference.java:426)
at com.sun.jna.Pointer.setValue(Pointer.java:885)
at com.sun.jna.Structure.writeField(Structure.java:856)
... 20 more
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
at com.sun.jna.Structure.newInstance(Structure.java:1771)
... 27 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at com.sun.jna.Structure.toArray(Structure.java:1551)
at com.sun.jna.Structure.toArray(Structure.java:1576)
at com.sun.jna.platform.win32.OaIdl$SAFEARRAY.read(OaIdl.java:610)
at com.sun.jna.platform.win32.OaIdl$SAFEARRAY.(OaIdl.java:604)
... 32 more
If you change the parameter type for runtimeId to int, the test passes successfully.
Not sure why writing a function pointer ends up trying to create a SAFEARRAY object. I can patch this by getting the SAFEARRAY as Pointer to the callback, and constructing the SAFEARRAY manually in the callback.
lwahonen@35acd04
See above commit for a minimal unit test.
It fails with
java.lang.IllegalArgumentException: Structure field "callback" was declared as interface com.sun.jna.CallbacksTest$vTable$functionpointer, which is not supported within a Structure
Caused by: java.lang.IllegalArgumentException: Exception thrown while instantiating an instance of class com.sun.jna.platform.win32.OaIdl$SAFEARRAY
at com.sun.jna.Structure.newInstance(Structure.java:1790)
at com.sun.jna.Structure.validate(Structure.java:2128)
at com.sun.jna.CallbackReference.getNativeType(CallbackReference.java:275)
at com.sun.jna.CallbackReference.(CallbackReference.java:248)
at com.sun.jna.CallbackReference.getFunctionPointer(CallbackReference.java:449)
at com.sun.jna.CallbackReference.getFunctionPointer(CallbackReference.java:426)
at com.sun.jna.Pointer.setValue(Pointer.java:885)
at com.sun.jna.Structure.writeField(Structure.java:856)
... 20 more
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
at com.sun.jna.Structure.newInstance(Structure.java:1771)
... 27 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at com.sun.jna.Structure.toArray(Structure.java:1551)
at com.sun.jna.Structure.toArray(Structure.java:1576)
at com.sun.jna.platform.win32.OaIdl$SAFEARRAY.read(OaIdl.java:610)
at com.sun.jna.platform.win32.OaIdl$SAFEARRAY.(OaIdl.java:604)
... 32 more
If you change the parameter type for runtimeId to int, the test passes successfully.
Not sure why writing a function pointer ends up trying to create a SAFEARRAY object. I can patch this by getting the SAFEARRAY as Pointer to the callback, and constructing the SAFEARRAY manually in the callback.