xref: /aosp_15_r20/external/cronet/base/android/jni_bytebuffer.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_ANDROID_JNI_BYTEBUFFER_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_ANDROID_JNI_BYTEBUFFER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <jni.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <optional>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace base::android {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker // Given a JNIEnv and a jobject representing a byte buffer, produce a base::span
18*6777b538SAndroid Build Coastguard Worker // corresponding to that byte buffer. These crash at runtime if the passed-in
19*6777b538SAndroid Build Coastguard Worker // jobject does not correspond to a java.nio.Buffer, or if the passed-in buffer
20*6777b538SAndroid Build Coastguard Worker // is unaligned and the current CPU architecture may sometimes require aligned
21*6777b538SAndroid Build Coastguard Worker // accesses - this requirement is enforced even if your code never actually
22*6777b538SAndroid Build Coastguard Worker // *does* the types of accesses that require alignment.
23*6777b538SAndroid Build Coastguard Worker //
24*6777b538SAndroid Build Coastguard Worker // Usually, that is what you want, since both of those conditions are programmer
25*6777b538SAndroid Build Coastguard Worker // errors.
26*6777b538SAndroid Build Coastguard Worker //
27*6777b538SAndroid Build Coastguard Worker // If needed, there are also variants below starting with Maybe that return
28*6777b538SAndroid Build Coastguard Worker // std::nullopt in that case and do not crash.
29*6777b538SAndroid Build Coastguard Worker base::span<const uint8_t> BASE_EXPORT JavaByteBufferToSpan(JNIEnv* env,
30*6777b538SAndroid Build Coastguard Worker                                                            jobject buffer);
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker base::span<uint8_t> BASE_EXPORT JavaByteBufferToMutableSpan(JNIEnv* env,
33*6777b538SAndroid Build Coastguard Worker                                                             jobject buffer);
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker std::optional<base::span<const uint8_t>> BASE_EXPORT
36*6777b538SAndroid Build Coastguard Worker MaybeJavaByteBufferToSpan(JNIEnv* env, jobject buffer);
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker std::optional<base::span<uint8_t>> BASE_EXPORT
39*6777b538SAndroid Build Coastguard Worker MaybeJavaByteBufferToMutableSpan(JNIEnv* env, jobject buffer);
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker }  // namespace base::android
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker #endif  // BASE_ANDROID_JNI_BYTEBUFFER_H_
44