Skip to content

Commit 9366f86

Browse files
Cleanup boilerplate code for downcalls
1 parent 474ba3e commit 9366f86

9 files changed

Lines changed: 111 additions & 142 deletions

api/src/main/java/club/minnced/discord/jdave/DaveDecryptor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package club.minnced.discord.jdave;
22

33
import static club.minnced.discord.jdave.ffi.LibDave.*;
4+
import static club.minnced.discord.jdave.ffi.LibDaveLookup.C_SIZE;
45

56
import club.minnced.discord.jdave.ffi.LibDaveDecryptorBinding;
67
import java.lang.foreign.Arena;

api/src/main/java/club/minnced/discord/jdave/DaveEncryptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package club.minnced.discord.jdave;
22

3-
import static club.minnced.discord.jdave.ffi.LibDave.C_SIZE;
43
import static club.minnced.discord.jdave.ffi.LibDave.readSize;
4+
import static club.minnced.discord.jdave.ffi.LibDaveLookup.C_SIZE;
55

66
import club.minnced.discord.jdave.ffi.LibDaveEncryptorBinding;
77
import java.lang.foreign.Arena;

api/src/main/java/club/minnced/discord/jdave/ffi/LibDave.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package club.minnced.discord.jdave.ffi;
22

3+
import static club.minnced.discord.jdave.ffi.LibDaveLookup.*;
34
import static java.lang.foreign.ValueLayout.*;
45

56
import club.minnced.discord.jdave.DaveLoggingSeverity;
67
import club.minnced.discord.jdave.utils.DaveLogger;
7-
import club.minnced.discord.jdave.utils.NativeLibraryLoader;
88
import java.lang.foreign.*;
99
import java.lang.invoke.MethodHandle;
1010
import java.lang.invoke.MethodHandles;
@@ -14,15 +14,6 @@
1414
import org.slf4j.LoggerFactory;
1515

1616
public class LibDave {
17-
static final Linker LINKER = Linker.nativeLinker();
18-
static final SymbolLookup SYMBOL_LOOKUP;
19-
public static final MemoryLayout C_SIZE;
20-
21-
static {
22-
SYMBOL_LOOKUP = NativeLibraryLoader.getSymbolLookup();
23-
C_SIZE = LINKER.canonicalLayouts().get("size_t");
24-
}
25-
2617
private LibDave() {}
2718

2819
static final Logger log = LoggerFactory.getLogger(LibDave.class);
@@ -33,17 +24,13 @@ private LibDave() {}
3324
static {
3425
try {
3526
// uint16_t daveMaxSupportedProtocolVersion(void);
36-
daveMaxSupportedProtocolVersion = LINKER.downcallHandle(
37-
SYMBOL_LOOKUP.find("daveMaxSupportedProtocolVersion").orElseThrow(),
38-
FunctionDescriptor.of(JAVA_SHORT));
27+
daveMaxSupportedProtocolVersion = find(JAVA_SHORT, "daveMaxSupportedProtocolVersion");
3928

4029
// void daveSetLogSinkCallback(DAVELogSinkCallback callback);
41-
daveSetLogSinkCallback = LINKER.downcallHandle(
42-
SYMBOL_LOOKUP.find("daveSetLogSinkCallback").orElseThrow(), FunctionDescriptor.ofVoid(ADDRESS));
30+
daveSetLogSinkCallback = findVoid("daveSetLogSinkCallback", ADDRESS);
4331

4432
// void daveFree(void*);
45-
daveFree = LINKER.downcallHandle(
46-
SYMBOL_LOOKUP.find("daveFree").orElseThrow(), FunctionDescriptor.ofVoid(ADDRESS));
33+
daveFree = findVoid("daveFree", ADDRESS);
4734
} catch (Throwable e) {
4835
throw new ExceptionInInitializerError(e);
4936
}

api/src/main/java/club/minnced/discord/jdave/ffi/LibDaveDecryptorBinding.java

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package club.minnced.discord.jdave.ffi;
22

3-
import static club.minnced.discord.jdave.ffi.LibDave.*;
3+
import static club.minnced.discord.jdave.ffi.LibDaveLookup.*;
44
import static club.minnced.discord.jdave.ffi.NativeUtils.toSizeT;
55
import static java.lang.foreign.ValueLayout.*;
66

77
import club.minnced.discord.jdave.DaveMediaType;
8-
import java.lang.foreign.FunctionDescriptor;
98
import java.lang.foreign.MemorySegment;
109
import java.lang.invoke.MethodHandle;
1110
import org.jspecify.annotations.NonNull;
@@ -22,45 +21,36 @@ public class LibDaveDecryptorBinding {
2221
static {
2322
try {
2423
// DAVEDecryptorHandle daveDecryptorCreate(void);
25-
daveDecryptorCreate = LINKER.downcallHandle(
26-
SYMBOL_LOOKUP.find("daveDecryptorCreate").orElseThrow(), FunctionDescriptor.of(ADDRESS));
24+
daveDecryptorCreate = find(ADDRESS, "daveDecryptorCreate");
2725

2826
// void daveDecryptorDestroy(DAVEDecryptorHandle decryptor);
29-
daveDecryptorDestroy = LINKER.downcallHandle(
30-
SYMBOL_LOOKUP.find("daveDecryptorDestroy").orElseThrow(), FunctionDescriptor.ofVoid(ADDRESS));
27+
daveDecryptorDestroy = findVoid("daveDecryptorDestroy", ADDRESS);
3128

3229
// size_t daveDecryptorGetMaxPlaintextByteSize(DAVEDecryptorHandle decryptor, DAVEMediaType mediaType,
3330
// size_t encryptedFrameSize);
34-
daveDecryptorGetMaxPlaintextByteSize = LINKER.downcallHandle(
35-
SYMBOL_LOOKUP.find("daveDecryptorGetMaxPlaintextByteSize").orElseThrow(),
36-
FunctionDescriptor.of(C_SIZE, ADDRESS, JAVA_INT, C_SIZE));
31+
daveDecryptorGetMaxPlaintextByteSize =
32+
find(C_SIZE, "daveDecryptorGetMaxPlaintextByteSize", ADDRESS, JAVA_INT, C_SIZE);
3733

3834
// DAVEDecryptorResultCode daveDecryptorDecrypt(DAVEDecryptorHandle decryptor, DAVEMediaType mediaType,
3935
// const uint8_t* encryptedFrame, size_t encryptedFrameLength, uint8_t* frame, size_t frameCapacity, size_t*
4036
// bytesWritten);
41-
daveDecryptorDecrypt = LINKER.downcallHandle(
42-
SYMBOL_LOOKUP.find("daveDecryptorDecrypt").orElseThrow(),
43-
FunctionDescriptor.of(
44-
JAVA_INT,
45-
ADDRESS,
46-
JAVA_INT,
47-
ADDRESS,
48-
C_SIZE,
49-
ADDRESS,
50-
C_SIZE,
51-
ADDRESS.withTargetLayout(C_SIZE)));
37+
daveDecryptorDecrypt = find(
38+
JAVA_INT,
39+
"daveDecryptorDecrypt",
40+
ADDRESS,
41+
JAVA_INT,
42+
ADDRESS,
43+
C_SIZE,
44+
ADDRESS,
45+
C_SIZE,
46+
ADDRESS.withTargetLayout(C_SIZE));
5247

5348
// void daveDecryptorTransitionToKeyRatchet(DAVEDecryptorHandle decryptor, DAVEKeyRatchetHandle keyRatchet);
54-
daveDecryptorTransitionToKeyRatchet = LINKER.downcallHandle(
55-
SYMBOL_LOOKUP.find("daveDecryptorTransitionToKeyRatchet").orElseThrow(),
56-
FunctionDescriptor.ofVoid(ADDRESS, ADDRESS));
49+
daveDecryptorTransitionToKeyRatchet = findVoid("daveDecryptorTransitionToKeyRatchet", ADDRESS, ADDRESS);
5750

5851
// void daveDecryptorTransitionToPassthroughMode(DAVEDecryptorHandle decryptor, bool passthroughMode);
59-
daveDecryptorTransitionToPassthroughMode = LINKER.downcallHandle(
60-
SYMBOL_LOOKUP
61-
.find("daveDecryptorTransitionToPassthroughMode")
62-
.orElseThrow(),
63-
FunctionDescriptor.ofVoid(ADDRESS, JAVA_BOOLEAN));
52+
daveDecryptorTransitionToPassthroughMode =
53+
findVoid("daveDecryptorTransitionToPassthroughMode", ADDRESS, JAVA_BOOLEAN);
6454
} catch (Throwable e) {
6555
throw new ExceptionInInitializerError(e);
6656
}

api/src/main/java/club/minnced/discord/jdave/ffi/LibDaveEncryptorBinding.java

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package club.minnced.discord.jdave.ffi;
22

3-
import static club.minnced.discord.jdave.ffi.LibDave.*;
3+
import static club.minnced.discord.jdave.ffi.LibDaveLookup.*;
44
import static club.minnced.discord.jdave.ffi.NativeUtils.toSizeT;
55
import static java.lang.foreign.ValueLayout.*;
66

7-
import java.lang.foreign.FunctionDescriptor;
87
import java.lang.foreign.MemorySegment;
9-
import java.lang.foreign.ValueLayout;
108
import java.lang.invoke.MethodHandle;
119
import org.jspecify.annotations.NonNull;
1210

@@ -23,54 +21,42 @@ public class LibDaveEncryptorBinding {
2321
static {
2422
try {
2523
// DAVEEncryptorHandle daveEncryptorCreate(void);
26-
daveEncryptorCreate = LINKER.downcallHandle(
27-
SYMBOL_LOOKUP.find("daveEncryptorCreate").orElseThrow(), FunctionDescriptor.of(ADDRESS));
24+
daveEncryptorCreate = find(ADDRESS, "daveEncryptorCreate");
2825

2926
// void daveEncryptorDestroy(DAVEEncryptorHandle encryptor);
30-
daveEncryptorDestroy = LINKER.downcallHandle(
31-
SYMBOL_LOOKUP.find("daveEncryptorDestroy").orElseThrow(), FunctionDescriptor.ofVoid(ADDRESS));
27+
daveEncryptorDestroy = findVoid("daveEncryptorDestroy", ADDRESS);
3228

3329
// void daveEncryptorSetKeyRatchet(DAVEEncryptorHandle encryptor, DAVEKeyRatchetHandle keyRatchet);
34-
daveEncryptorSetKeyRatchet = LINKER.downcallHandle(
35-
SYMBOL_LOOKUP.find("daveEncryptorSetKeyRatchet").orElseThrow(),
36-
FunctionDescriptor.ofVoid(ADDRESS, ADDRESS));
30+
daveEncryptorSetKeyRatchet = findVoid("daveEncryptorSetKeyRatchet", ADDRESS, ADDRESS);
3731

3832
// void daveEncryptorSetPassthroughMode(DAVEEncryptorHandle encryptor, bool passthroughMode);
39-
daveEncryptorSetPassthroughMode = LINKER.downcallHandle(
40-
SYMBOL_LOOKUP.find("daveEncryptorSetPassthroughMode").orElseThrow(),
41-
FunctionDescriptor.ofVoid(ADDRESS, JAVA_BOOLEAN));
33+
daveEncryptorSetPassthroughMode = findVoid("daveEncryptorSetPassthroughMode", ADDRESS, JAVA_BOOLEAN);
4234

4335
// uint16_t daveEncryptorGetProtocolVersion(DAVEEncryptorHandle encryptor);
44-
daveEncryptorGetProtocolVersion = LINKER.downcallHandle(
45-
SYMBOL_LOOKUP.find("daveEncryptorGetProtocolVersion").orElseThrow(),
46-
FunctionDescriptor.of(ValueLayout.JAVA_SHORT, ADDRESS));
36+
daveEncryptorGetProtocolVersion = find(JAVA_SHORT, "daveEncryptorGetProtocolVersion", ADDRESS);
4737

4838
// size_t daveEncryptorGetMaxCiphertextByteSize(DAVEEncryptorHandle encryptor, DAVEMediaType mediaType,
4939
// size_t frameSize);
50-
daveEncryptorGetMaxCiphertextByteSize = LINKER.downcallHandle(
51-
SYMBOL_LOOKUP.find("daveEncryptorGetMaxCiphertextByteSize").orElseThrow(),
52-
FunctionDescriptor.of(C_SIZE, ADDRESS, JAVA_INT, C_SIZE));
40+
daveEncryptorGetMaxCiphertextByteSize =
41+
find(C_SIZE, "daveEncryptorGetMaxCiphertextByteSize", ADDRESS, JAVA_INT, C_SIZE);
5342

5443
// DAVEEncryptorResultCode daveEncryptorEncrypt(DAVEEncryptorHandle encryptor, DAVEMediaType mediaType,
5544
// uint32_t ssrc, const uint8_t* frame, size_t frameLength, uint8_t* encryptedFrame, size_t
5645
// encryptedFrameCapacity, size_t* bytesWritten);
57-
daveEncryptorEncrypt = LINKER.downcallHandle(
58-
SYMBOL_LOOKUP.find("daveEncryptorEncrypt").orElseThrow(),
59-
FunctionDescriptor.of(
60-
JAVA_INT,
61-
ADDRESS,
62-
JAVA_INT,
63-
JAVA_INT,
64-
ADDRESS,
65-
C_SIZE,
66-
ADDRESS,
67-
C_SIZE,
68-
ADDRESS.withTargetLayout(C_SIZE)));
46+
daveEncryptorEncrypt = find(
47+
JAVA_INT,
48+
"daveEncryptorEncrypt",
49+
ADDRESS,
50+
JAVA_INT,
51+
JAVA_INT,
52+
ADDRESS,
53+
C_SIZE,
54+
ADDRESS,
55+
C_SIZE,
56+
ADDRESS.withTargetLayout(C_SIZE));
6957

7058
// void daveEncryptorAssignSsrcToCodec(DAVEEncryptorHandle encryptor, uint32_t ssrc, DAVECodec codecType);
71-
daveEncryptorAssignSsrcToCodec = LINKER.downcallHandle(
72-
SYMBOL_LOOKUP.find("daveEncryptorAssignSsrcToCodec").orElseThrow(),
73-
FunctionDescriptor.ofVoid(ADDRESS, JAVA_INT, JAVA_INT));
59+
daveEncryptorAssignSsrcToCodec = findVoid("daveEncryptorAssignSsrcToCodec", ADDRESS, JAVA_INT, JAVA_INT);
7460
} catch (Throwable e) {
7561
throw new ExceptionInInitializerError(e);
7662
}

api/src/main/java/club/minnced/discord/jdave/ffi/LibDaveKeyRatchetBinding.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package club.minnced.discord.jdave.ffi;
22

3-
import static club.minnced.discord.jdave.ffi.LibDave.LINKER;
4-
import static club.minnced.discord.jdave.ffi.LibDave.SYMBOL_LOOKUP;
3+
import static club.minnced.discord.jdave.ffi.LibDaveLookup.findVoid;
54
import static java.lang.foreign.ValueLayout.ADDRESS;
65

7-
import java.lang.foreign.FunctionDescriptor;
86
import java.lang.foreign.MemorySegment;
97
import java.lang.invoke.MethodHandle;
108
import org.jspecify.annotations.NonNull;
@@ -15,8 +13,7 @@ public class LibDaveKeyRatchetBinding {
1513
static {
1614
try {
1715
// void daveKeyRatchetDestroy(DAVEKeyRatchetHandle keyRatchet);
18-
destroyKeyRatchet = LINKER.downcallHandle(
19-
SYMBOL_LOOKUP.find("daveKeyRatchetDestroy").orElseThrow(), FunctionDescriptor.ofVoid(ADDRESS));
16+
destroyKeyRatchet = findVoid("daveKeyRatchetDestroy", ADDRESS);
2017
} catch (Throwable e) {
2118
throw new ExceptionInInitializerError(e);
2219
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package club.minnced.discord.jdave.ffi;
2+
3+
import club.minnced.discord.jdave.utils.NativeLibraryLoader;
4+
import java.lang.foreign.FunctionDescriptor;
5+
import java.lang.foreign.Linker;
6+
import java.lang.foreign.MemoryLayout;
7+
import java.lang.foreign.SymbolLookup;
8+
import java.lang.invoke.MethodHandle;
9+
10+
public class LibDaveLookup {
11+
static final Linker LINKER = Linker.nativeLinker();
12+
static final SymbolLookup SYMBOL_LOOKUP;
13+
public static final MemoryLayout C_SIZE;
14+
15+
static {
16+
SYMBOL_LOOKUP = NativeLibraryLoader.getSymbolLookup();
17+
C_SIZE = LINKER.canonicalLayouts().get("size_t");
18+
}
19+
20+
public static MethodHandle findVoid(String name, MemoryLayout... args) {
21+
return LINKER.downcallHandle(SYMBOL_LOOKUP.findOrThrow(name), FunctionDescriptor.ofVoid(args));
22+
}
23+
24+
public static MethodHandle find(MemoryLayout returnType, String name, MemoryLayout... args) {
25+
return LINKER.downcallHandle(SYMBOL_LOOKUP.findOrThrow(name), FunctionDescriptor.of(returnType, args));
26+
}
27+
}

0 commit comments

Comments
 (0)