Skip to content

Commit 16eda4c

Browse files
committed
fix(capi): preserve nested char pointers in generated bindings
Carry C pointer depth, base type, qualifiers, and direction metadata through spec generation so char** and char*** parameters use pointer-shaped Go values and exact CGo types. Regenerate affected bindings and enable cgocheck=1 by default for Makefile commands while retaining explicit overrides. Reported-by: OvOhao Issue: #1
1 parent 83f4e5e commit 16eda4c

62 files changed

Lines changed: 1503 additions & 252 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/ci.yml‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ jobs:
7777
api-level: 35
7878
target: google_apis
7979
arch: x86_64
80-
script: make e2e-examples
80+
script: |
81+
make e2e-examples
82+
make e2e-examples-test
8183
8284
release:
8385
name: Release ndkcli

‎Makefile‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
export PATH := $(HOME)/go/bin:$(PATH)
22

3+
GODEBUG ?= cgocheck=1
4+
export GODEBUG
5+
36
ANDROID_HOME ?= $(HOME)/Android/Sdk
47
NDK_PATH ?= $(or $(ANDROID_NDK_HOME),$(shell ls -d $(ANDROID_HOME)/ndk/* 2>/dev/null | sort -V | tail -1))
58

@@ -16,6 +19,7 @@ MODULES := aaudio camera sensor gles2 gles3 egl vulkan media \
1619
FIXTURE_MODULES := $(notdir $(wildcard tools/pkg/specgen/testdata/*/))
1720

1821
NDK_SYSROOT := $(NDK_PATH)/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include
22+
NDK_CGO_SYSROOT := $(NDK_PATH)/toolchains/llvm/prebuilt/linux-x86_64/sysroot
1923
C2FFI_BIN ?= c2ffi
2024

2125
API_LEVEL ?= 35
@@ -122,12 +126,14 @@ lint:
122126
# Cross-compile all examples and ndkcli for Android arm64 to catch compile errors (requires NDK)
123127
check-examples:
124128
CGO_ENABLED=1 GOOS=android GOARCH=arm64 CC=$(NDK_CC_ARM64) \
129+
CGO_CFLAGS="$(CGO_CFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_CPPFLAGS="$(CGO_CPPFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_LDFLAGS="$(CGO_LDFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" \
125130
go build ./examples/... ./cmd/ndkcli/
126131

127132
# Cross-compile E2E test binary for Android x86_64 (requires NDK)
128133
e2e-build:
129134
@mkdir -p $(BUILD_DIR)
130135
CGO_ENABLED=1 GOOS=android GOARCH=amd64 CC=$(NDK_CC_X86_64) \
136+
CGO_CFLAGS="$(CGO_CFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_CPPFLAGS="$(CGO_CPPFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_LDFLAGS="$(CGO_LDFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" \
131137
go build -o $(BUILD_DIR)/e2e_test ./tests/e2e
132138

133139
# Run full E2E test on Android emulator (requires SDK + NDK + KVM)
@@ -164,14 +170,17 @@ install-ndk:
164170
ndkcli:
165171
@mkdir -p $(BUILD_DIR)
166172
CGO_ENABLED=1 GOOS=android GOARCH=arm64 CC=$(NDK_CC_ARM64) \
173+
CGO_CFLAGS="$(CGO_CFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_CPPFLAGS="$(CGO_CPPFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_LDFLAGS="$(CGO_LDFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" \
167174
go build -o $(BUILD_DIR)/ndkcli ./cmd/ndkcli/
168175

169176
# Build release binaries for both architectures (stripped)
170177
ndkcli-release:
171178
@mkdir -p $(BUILD_DIR)
172179
CGO_ENABLED=1 GOOS=android GOARCH=arm64 CC=$(NDK_CC_ARM64) \
180+
CGO_CFLAGS="$(CGO_CFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_CPPFLAGS="$(CGO_CPPFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_LDFLAGS="$(CGO_LDFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" \
173181
go build -trimpath -ldflags="-s -w" -o $(BUILD_DIR)/ndkcli-android-arm64 ./cmd/ndkcli/
174182
CGO_ENABLED=1 GOOS=android GOARCH=amd64 CC=$(NDK_CC_X86_64) \
183+
CGO_CFLAGS="$(CGO_CFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_CPPFLAGS="$(CGO_CPPFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_LDFLAGS="$(CGO_LDFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" \
175184
go build -trimpath -ldflags="-s -w" -o $(BUILD_DIR)/ndkcli-android-x86_64 ./cmd/ndkcli/
176185

177186
# Print all ndkcli subcommands (extracted from source, no binary needed)
@@ -217,6 +226,7 @@ apk-displaycamera: $(APK_KEYSTORE)
217226
@rm -rf $(BUILD)
218227
@mkdir -p $(BUILD)/lib/$(APK_ABI)
219228
CGO_ENABLED=1 GOOS=android GOARCH=$(APK_GOARCH) CC=$(APK_CC) \
229+
CGO_CFLAGS="$(CGO_CFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_CPPFLAGS="$(CGO_CPPFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" CGO_LDFLAGS="$(CGO_LDFLAGS) --sysroot=$(NDK_CGO_SYSROOT)" \
220230
go build -buildmode=c-shared \
221231
-o $(BUILD)/lib/$(APK_ABI)/libdisplaycamera.so \
222232
./$(DIR)

‎capi/aaudio/cgo_helpers.c‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#include "_cgo_export.h"
44

5-
aaudio_data_callback_result_t AAudioStream_dataCallback_aeff7e8c(AAudioStream* stream, void* userData, void* audioData, int numFrames) {
5+
aaudio_data_callback_result_t AAudioStream_dataCallback_aeff7e8c(AAudioStream* stream, void* userData, void* audioData, int32_t numFrames) {
66
return AAudioStream_dataCallbackAEFF7E8C(stream, userData, audioData, numFrames);
77
}
88

‎capi/aaudio/cgo_helpers.go‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎capi/aaudio/cgo_helpers.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#define __CGOGEN 1
88

99
// AAudioStream_dataCallback_aeff7e8c is a proxy for callback AAudioStream_dataCallback.
10-
aaudio_data_callback_result_t AAudioStream_dataCallback_aeff7e8c(AAudioStream* stream, void* userData, void* audioData, int numFrames);
10+
aaudio_data_callback_result_t AAudioStream_dataCallback_aeff7e8c(AAudioStream* stream, void* userData, void* audioData, int32_t numFrames);
1111

1212
// AAudioStream_errorCallback_272a051c is a proxy for callback AAudioStream_errorCallback.
1313
void AAudioStream_errorCallback_272a051c(AAudioStream* stream, void* userData, aaudio_result_t _error);

‎capi/binder/binder.go‎

Lines changed: 10 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎capi/binder/cgo_helpers.c‎

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ void AIBinder_Class_onDestroy_2c719d10(void* userData) {
1010
AIBinder_Class_onDestroy2C719D10(userData);
1111
}
1212

13-
binder_status_t AIBinder_Class_onTransact_4c5b3f35(AIBinder* binder, transaction_code_t code, AParcel* in, AParcel* out) {
14-
return AIBinder_Class_onTransact4C5B3F35(binder, code, in, out);
13+
binder_status_t AIBinder_Class_onTransact_4c5b3f35(AIBinder* binder, transaction_code_t code, const AParcel* in, AParcel* out) {
14+
return AIBinder_Class_onTransact4C5B3F35(binder, code, (AParcel*)in, out);
1515
}
1616

1717
void AIBinder_DeathRecipient_onBinderDied_7d6f4f1b() {
@@ -22,79 +22,78 @@ void AIBinder_DeathRecipient_onBinderUnlinked_6d499f91() {
2222
AIBinder_DeathRecipient_onBinderUnlinked6D499F91();
2323
}
2424

25-
binder_status_t AIBinder_onDump_04709357(AIBinder* binder, int fd, int8_t** args, unsigned int numArgs) {
26-
return AIBinder_onDump04709357(binder, fd, args, numArgs);
25+
binder_status_t AIBinder_onDump_04709357(AIBinder* binder, int fd, const char** args, uint32_t numArgs) {
26+
return AIBinder_onDump04709357(binder, fd, (char**)args, numArgs);
2727
}
2828

29-
_Bool AParcel_boolArrayAllocator_6ce04d29(void* arrayData, int length) {
29+
_Bool AParcel_boolArrayAllocator_6ce04d29(void* arrayData, int32_t length) {
3030
return AParcel_boolArrayAllocator6CE04D29(arrayData, length);
3131
}
3232

33-
_Bool AParcel_boolArrayGetter_58f10d8e(void* arrayData, uint64_t index) {
34-
return AParcel_boolArrayGetter58F10D8E(arrayData, index);
33+
_Bool AParcel_boolArrayGetter_58f10d8e(const void* arrayData, size_t index) {
34+
return AParcel_boolArrayGetter58F10D8E((void*)arrayData, index);
3535
}
3636

37-
void AParcel_boolArraySetter_c31d06a6(void* arrayData, uint64_t index, _Bool value) {
37+
void AParcel_boolArraySetter_c31d06a6(void* arrayData, size_t index, bool value) {
3838
AParcel_boolArraySetterC31D06A6(arrayData, index, value);
3939
}
4040

41-
_Bool AParcel_byteArrayAllocator_0f5d9bcb(void* arrayData, int length, int8_t** outBuffer) {
41+
_Bool AParcel_byteArrayAllocator_0f5d9bcb(void* arrayData, int32_t length, int8_t** outBuffer) {
4242
return AParcel_byteArrayAllocator0F5D9BCB(arrayData, length, outBuffer);
4343
}
4444

45-
_Bool AParcel_charArrayAllocator_e28a23c0(void* arrayData, int length, char16_t** outBuffer) {
45+
_Bool AParcel_charArrayAllocator_e28a23c0(void* arrayData, int32_t length, char16_t** outBuffer) {
4646
return AParcel_charArrayAllocatorE28A23C0(arrayData, length, outBuffer);
4747
}
4848

49-
_Bool AParcel_doubleArrayAllocator_0d8e072d(void* arrayData, int length, double** outBuffer) {
49+
_Bool AParcel_doubleArrayAllocator_0d8e072d(void* arrayData, int32_t length, double** outBuffer) {
5050
return AParcel_doubleArrayAllocator0D8E072D(arrayData, length, outBuffer);
5151
}
5252

53-
_Bool AParcel_floatArrayAllocator_ddd314b6(void* arrayData, int length, float** outBuffer) {
53+
_Bool AParcel_floatArrayAllocator_ddd314b6(void* arrayData, int32_t length, float** outBuffer) {
5454
return AParcel_floatArrayAllocatorDDD314B6(arrayData, length, outBuffer);
5555
}
5656

57-
_Bool AParcel_int32ArrayAllocator_632db075(void* arrayData, int length, int** outBuffer) {
57+
_Bool AParcel_int32ArrayAllocator_632db075(void* arrayData, int32_t length, int32_t** outBuffer) {
5858
return AParcel_int32ArrayAllocator632DB075(arrayData, length, outBuffer);
5959
}
6060

61-
_Bool AParcel_int64ArrayAllocator_e9ccd3bd(void* arrayData, int length, int64_t** outBuffer) {
61+
_Bool AParcel_int64ArrayAllocator_e9ccd3bd(void* arrayData, int32_t length, int64_t** outBuffer) {
6262
return AParcel_int64ArrayAllocatorE9CCD3BD(arrayData, length, outBuffer);
6363
}
6464

65-
_Bool AParcel_parcelableArrayAllocator_6a96d230(void* arrayData, int length) {
65+
_Bool AParcel_parcelableArrayAllocator_6a96d230(void* arrayData, int32_t length) {
6666
return AParcel_parcelableArrayAllocator6A96D230(arrayData, length);
6767
}
6868

69-
binder_status_t AParcel_readParcelableElement_f5964747(AParcel* parcel, void* arrayData, uint64_t index) {
70-
return AParcel_readParcelableElementF5964747(parcel, arrayData, index);
69+
binder_status_t AParcel_readParcelableElement_f5964747(const AParcel* parcel, void* arrayData, size_t index) {
70+
return AParcel_readParcelableElementF5964747((AParcel*)parcel, arrayData, index);
7171
}
7272

73-
_Bool AParcel_stringAllocator_fed8100a(void* stringData, int length, int8_t** buffer) {
73+
_Bool AParcel_stringAllocator_fed8100a(void* stringData, int32_t length, char** buffer) {
7474
return AParcel_stringAllocatorFED8100A(stringData, length, buffer);
7575
}
7676

77-
_Bool AParcel_stringArrayAllocator_a431f501(void* arrayData, int length) {
77+
_Bool AParcel_stringArrayAllocator_a431f501(void* arrayData, int32_t length) {
7878
return AParcel_stringArrayAllocatorA431F501(arrayData, length);
7979
}
8080

81-
_Bool AParcel_stringArrayElementAllocator_9ac166ca(void* arrayData, uint64_t index, int length, int8_t** buffer) {
81+
_Bool AParcel_stringArrayElementAllocator_9ac166ca(void* arrayData, size_t index, int32_t length, char** buffer) {
8282
return AParcel_stringArrayElementAllocator9AC166CA(arrayData, index, length, buffer);
8383
}
8484

85-
int8_t* AParcel_stringArrayElementGetter_6817b794(void* arrayData, uint64_t index, int* outLength) {
86-
return AParcel_stringArrayElementGetter6817B794(arrayData, index, outLength);
85+
const char* AParcel_stringArrayElementGetter_6817b794(const void* arrayData, size_t index, int32_t* outLength) {
86+
return AParcel_stringArrayElementGetter6817B794((void*)arrayData, index, outLength);
8787
}
8888

89-
_Bool AParcel_uint32ArrayAllocator_dffad45c(void* arrayData, int length, unsigned int** outBuffer) {
89+
_Bool AParcel_uint32ArrayAllocator_dffad45c(void* arrayData, int32_t length, uint32_t** outBuffer) {
9090
return AParcel_uint32ArrayAllocatorDFFAD45C(arrayData, length, outBuffer);
9191
}
9292

93-
_Bool AParcel_uint64ArrayAllocator_cf52b274(void* arrayData, int length, uint64_t** outBuffer) {
93+
_Bool AParcel_uint64ArrayAllocator_cf52b274(void* arrayData, int32_t length, uint64_t** outBuffer) {
9494
return AParcel_uint64ArrayAllocatorCF52B274(arrayData, length, outBuffer);
9595
}
9696

97-
binder_status_t AParcel_writeParcelableElement_73cca07c(AParcel* parcel, void* arrayData, uint64_t index) {
98-
return AParcel_writeParcelableElement73CCA07C(parcel, arrayData, index);
97+
binder_status_t AParcel_writeParcelableElement_73cca07c(AParcel* parcel, const void* arrayData, size_t index) {
98+
return AParcel_writeParcelableElement73CCA07C(parcel, (void*)arrayData, index);
9999
}
100-

0 commit comments

Comments
 (0)