我想使用巴拿马项目的外部函数接口从Java 19访问C库.C接口非常简单:
typedef struct {
int len;
char name[100];
} ent;
ent* foo();
当被调用时,函数foo返回指向struct ent
的指针,其中len
表示字符串name
的大小.
对应的Java端为:
private static final MemoryLayout ENT_LAYOUT = MemoryLayout.structLayout(
JAVA_INT.withName("len"),
MemoryLayout.sequenceLayout(100, ValueLayout.JAVA_BYTE).withName("name")
);
为了便于访问,我希望使用VarHandle
:
private static final VarHandle VH_ENT_LEN = ENT_LAYOUT.varHandle(groupElement("len"));
后来,
int len = (int)VH_ENT_LEN.get(segment);
String name = segment.asSlice(ENT_LAYOUT.byteOffset(groupElement("name")), len).getUtf8String(0);
还是有点乱.
我天真的期望是,解决方案应该是这样的:
private static final VarHandle VH_ENT_NAME = ENT_LAYOUT.varHandle(groupElement("name"), sequenceElement());
byte[] nameRaw = (byte[])VH_ENT_NAME.get(segment);
然而,我得到的是:
java.lang.RuntimeException: java.lang.invoke.WrongMethodTypeException:
cannot convert MethodHandle(VarHandle,MemorySegment,long)byte to (VarHandle,MemorySegment)byte[]
所以,问题是:有没有一个很好的解决方案来从Java外来API访问数组,或者我们应该坚持VarHandle
和slice
的混合.