Linker 怎么描述 C 函数的签名?结构体、变参、errno 各自要怎么写?写错了会怎样?上行调用里抛异常又会怎样?这篇用真实的 C 库逐个运行。
1 struct{double,double}(16 字节)按值传入、按值返回:mid((1,2),(3,8)) = (2.0, 5.0);descriptor 的方法类型:(SegmentAllocator,MemorySegment,MemorySegment)MemorySegment
2 struct{int,int}(8 字节)按值传入:pair_sum = 7009(期望 7*1000+9 = 7009)
3 struct{long×4}(32 字节)按值返回:big_make(5) = (5, 10, 15, 20)
big_sum(刚才返回的结构体)= 50(期望 5+10+15+20 = 50) 4 snprintf 变参(firstVariadicArg(3)):返回 24,内容 "42-abc-3.14-123456789012"
不声明 firstVariadicArg(按普通函数调用):返回 31,内容 "608294592-h�-0.00-4681796456"
firstVariadicArg(9)(超出参数个数):IllegalArgumentException: Index '9' not in bounds for descriptor: (a8j8a8i4)i4
变参里用 JAVA_BYTE(C 会提升为 int):IllegalArgumentException: Invalid variadic argument layout: b1 5 open("/definitely/not/here") 返回 -1,捕获的 errno = 2,strerror = "No such file or directory";捕获布局 [i4(errno)]
Linker.Option.captureStateLayout() 在本平台包含的成员:[i4(errno)]
captureCallState("nonexistent"):IllegalArgumentException: Unknown name: nonexistent, must be one of: [errno]6 getpid:普通下行调用 4.35 ns/次;Linker.Option.critical(false) 3.17 ns/次(各 2000 万次,取第 4、5 轮较小值)
7 C 回调 Java 函数 10 次:callback_sum = 90(期望 0+2+…+18 = 90),Java 方法被调用 10 次;stub 地址非空:true
上行调用的方法类型与 descriptor 不匹配(返回 long 对 int):IllegalArgumentException: Wrong method handle type: (int)int
invokeExact 参数类型写错(long 对 int):WrongMethodTypeException: handle's method type (MemorySegment,int)int but found (MemorySegment,long)voidjava.lang.IllegalStateException: 上行调用里抛出的异常 at Main.boom(Main.java:8) at Main.main(Main.java:57) Unrecoverable uncaught exception encountered. The VM will now exit (退出码 1)