gpt4 book ai didi

java - JNR 的回调/闭包采用指针参数

转载 作者:搜寻专家 更新时间:2023-11-01 00:56:26 25 4
gpt4 key购买 nike

我正在使用 JNR 并尝试传递具有以下 C 等效签名的回调函数:

int fn(void const*, void const**, void**)

进入一些 C 函数。我已将嵌套在 Java 端的 JNR 库接口(interface)中的回调声明为:

public static interface Fn {
@Delegate public int call(Pointer a, Pointer[] b, Pointer[] c);
}

用JNR库接口(interface)中的另一个函数

public int doSomething(Fn fn);

在接受 int(*)(void const*, void const**, void**) 的 C 代码中用作 doSomething 的包装器。但是每当我创建回调时:

new Fn() { int call() { ... } };

然后将其传递给我的 JNR 库接口(interface)的 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 的使用有什么问题?

最佳答案

如果是 C 调用 Java,我认为仅通过 C 指针就不可能为 Java 提供实际的 Java 数组。

首先,Java数组对象有内置长度,但C指针值本身不包含上限。 C 通常使用诸如零终止字符串或传递两个参数(ptr、len)之类的约定。

其次,Java 数组必须在使用前填充(即不是懒惰的)。这意味着加载所有指向数组的指针,这可能是低效的。这也需要使用已知的数组长度来完成。

我建议在访问指向数组的指针时,自己在 Java 中进行指针运算。这需要了解特定于平台的内存布局(例如,指针数组中一个指针元素的长度),但所有 native 接口(interface)都是特定于平台的。

关于java - JNR 的回调/闭包采用指针参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26199515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com