blob: ae5236442a262c24ffecd088b7b1c24225893ede [file] [log] [blame]
Ken Rockot3eb1d12e2024-06-12 04:18:351// Copyright 2024 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_ANDROID_BINDER_BOX_H_
6#define BASE_ANDROID_BINDER_BOX_H_
7
8#include <jni.h>
9
10#include <vector>
11
12#include "base/android/binder.h"
13#include "base/android/scoped_java_ref.h"
14#include "base/base_export.h"
15
16namespace base::android {
17
18// Creates a new binder box containing `binders` and returns a Java reference to
19// it. The Java reference (which itself is an android.os.IBinder) may be passed
20// to another process and unpacked there by UnpackBinderBox().
21//
22// The point of this thing is to conveniently pass native binders through Java
23// code (e.g. across Java AIDL) without actually taking Java references to them.
24// This is desirable because by design AIBinder_toJavaBinder actually leaks
25// IBinder references for an indeterminate period of time, which is unacceptable
26// for native binder users who want deterministic control of their binder's
27// refcounts.
28BASE_EXPORT ScopedJavaLocalRef<jobject> PackBinderBox(
29 JNIEnv* env,
30 std::vector<BinderRef> binders);
31
32// Retrieves a collection of binders stashed in a binder box.
33BASE_EXPORT BinderStatusOr<std::vector<BinderRef>> UnpackBinderBox(
34 JNIEnv* env,
35 const JavaRef<jobject>& box);
36
37} // namespace base::android
38
39#endif // BASE_ANDROID_BINDER_BOX_H_