1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_ANDROID_JNI_CALLBACK_H_
#define BASE_ANDROID_JNI_CALLBACK_H_
#include <jni.h>
#include <type_traits>
#include "base/android/scoped_java_ref.h"
#include "base/base_export.h"
#include "base/functional/callback_forward.h"
#include "base/functional/callback_helpers.h"
#include "third_party/jni_zero/jni_zero.h"
namespace base::android {
using JniOnceWrappedCallbackType =
base::OnceCallback<void(const jni_zero::JavaRef<jobject>&)>;
using JniRepeatingWrappedCallbackType =
base::RepeatingCallback<void(const jni_zero::JavaRef<jobject>&)>;
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback(
JNIEnv* env,
JniOnceWrappedCallbackType&& callback);
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback(
JNIEnv* env,
JniRepeatingWrappedCallbackType&& callback);
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback(
JNIEnv* env,
const JniRepeatingWrappedCallbackType& callback);
// Overloads that accept no parameter.
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback(
JNIEnv* env,
base::OnceCallback<void()>&& callback);
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback(
JNIEnv* env,
const base::RepeatingCallback<void()>& callback);
// Java Callbacks don't return a value so any return value by the passed in
// callback will be ignored.
template <typename R, typename Arg>
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback(
JNIEnv* env,
base::OnceCallback<R(Arg)>&& callback) {
return ToJniCallback(env, base::BindOnce(
[](base::OnceCallback<R(Arg)> captured_callback,
const jni_zero::JavaRef<jobject>& j_result) {
Arg result = jni_zero::FromJniType<Arg>(
jni_zero::AttachCurrentThread(),
j_result);
std::move(captured_callback).Run(result);
},
std::move(callback)));
}
// Java Callbacks don't return a value so any return value by the passed in
// callback will be ignored.
template <typename R>
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback(
JNIEnv* env,
base::OnceCallback<R()>&& callback) {
return ToJniCallback(env, base::BindOnce(
[](base::OnceCallback<R()> captured_callback,
const jni_zero::JavaRef<jobject>& j_result) {
std::move(captured_callback).Run();
},
std::move(callback)));
}
// Java Callbacks don't return a value so any return value by the passed in
// callback will be ignored.
template <typename R, typename Arg>
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback(
JNIEnv* env,
const base::RepeatingCallback<R(Arg)>& callback) {
return ToJniCallback(
env, base::BindRepeating(
[](const base::RepeatingCallback<R(Arg)>& captured_callback,
const jni_zero::JavaRef<jobject>& j_result) {
Arg result = jni_zero::FromJniType<Arg>(
jni_zero::AttachCurrentThread(), j_result);
captured_callback.Run(result);
},
callback));
}
// Java Callbacks don't return a value so any return value by the passed in
// callback will be ignored.
template <typename R>
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback(
JNIEnv* env,
const base::RepeatingCallback<R()>& callback) {
return ToJniCallback(
env, base::BindRepeating(
[](const base::RepeatingCallback<R()>& captured_callback,
const jni_zero::JavaRef<jobject>& j_result) {
captured_callback.Run();
},
callback));
}
} // namespace base::android
#endif // BASE_ANDROID_JNI_CALLBACK_H_
|