【发布时间】:2014-10-05 04:02:37
【问题描述】:
我正在使用 JNR 并尝试使用以下 C 等效签名传递回调函数:
int fn(void const*, void const**, void**)
进入一些 C 函数。我已将嵌套在 Java 端的 JNR 库接口中的回调声明为:
public static interface Fn {
@Delegate public int call(Pointer a, Pointer[] b, Pointer[] c);
}
与 JNR 库接口中的另一个函数
public int doSomething(Fn fn);
在接受int(*)(void const*, void const**, void**) 的C 代码中充当doSomething 的包装器。但是每当我创建回调时:
new Fn() { int call() { ... } };
并将其传递给我的 JNR 库接口的 doSomething 方法,我得到运行时错误:
java.lang.ExceptionInInitializerError
Caused by:
java.lang.IllegalArgumentException: unsupported closure parameter type class [Ljnr.ffi.Pointer;
at jnr.ffi.provider.jffi.NativeClosureProxy.newProxyFactory(NativeClosureProxy.java:109)
at jnr.ffi.provider.jffi.NativeClosureFactory.newClosureFactory(NativeClosureFactory.java:84)
at jnr.ffi.provider.jffi.NativeClosureManager.initClosureFactory(NativeClosureManager.java:71)
at jnr.ffi.provider.jffi.NativeClosureManager.getClosureFactory(NativeClosureManager.java:49)
at jnr.ffi.provider.jffi.NativeClosureManager.newClosureSite(NativeClosureManager.java:81)
at jnr.ffi.provider.jffi.InvokerTypeMapper.getToNativeConverter(InvokerTypeMapper.java:68)
at jnr.ffi.provider.jffi.InvokerTypeMapper.getToNativeType(InvokerTypeMapper.java:143)
at jnr.ffi.mapper.CachingTypeMapper.lookupAndCacheToNativeType(CachingTypeMapper.java:71)
at jnr.ffi.mapper.CachingTypeMapper.getToNativeType(CachingTypeMapper.java:43)
at jnr.ffi.mapper.CompositeTypeMapper.getToNativeType(CompositeTypeMapper.java:34)
at jnr.ffi.provider.jffi.InvokerUtil.getParameterTypes(InvokerUtil.java:185)
at jnr.ffi.provider.jffi.AsmLibraryLoader.generateInterfaceImpl(AsmLibraryLoader.java:125)
at jnr.ffi.provider.jffi.AsmLibraryLoader.loadLibrary(AsmLibraryLoader.java:59)
at jnr.ffi.provider.jffi.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:43)
at jnr.ffi.LibraryLoader.load(LibraryLoader.java:265)
at jnr.ffi.LibraryLoader.load(LibraryLoader.java:244)
我使用 Pointer 有什么问题?
【问题讨论】:
-
发现这个:github.com/jnr/jnr-ffi/blob/master/src/main/java/jnr/ffi/… 不管什么原因,Pointer 数组在某个时候被支持,然后被注释掉了。或者它们是一个想法并在实施之前被注释掉?还是什么?
-
无论如何,目前正在废弃
[]s,只是通过get方法通过指针参数访问指针元素...