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