0

JNI Zero: Do not dereference pointers for @JniType("vector<T*>")

The automatic dereferencing is desirable in some case, but not in all
cases (e.g. Profile*). We shouldn't do it automatically.

Bug: b/326465150
Change-Id: Iee8c3ddf1eb5c306c6f88556a94aafa93876a706
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5527567
Auto-Submit: Andrew Grieve <agrieve@chromium.org>
Commit-Queue: Andrew Grieve <agrieve@chromium.org>
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
Owners-Override: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1299450}
This commit is contained in:
Andrew Grieve
2024-05-10 19:49:20 +00:00
committed by Chromium LUCI CQ
parent e119e5eeed
commit f40ebf9f5c
3 changed files with 35 additions and 16 deletions
base/android
third_party/jni_zero
url/android

@ -28,6 +28,17 @@ BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniType<std::string>(
return base::android::ConvertUTF8ToJavaString(env, input);
}
// Enables vector<const std::string*> to avoid copies.
template <>
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniType<const std::string*>(
JNIEnv* env,
const std::string* const& input) {
if (!input) {
return nullptr;
}
return base::android::ConvertUTF8ToJavaString(env, *input);
}
template <>
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniType<const char*>(
JNIEnv* env,
@ -50,6 +61,17 @@ BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniType<std::u16string>(
return base::android::ConvertUTF16ToJavaString(env, input);
}
// Enables vector<const std::u16string*> to avoid copies.
template <>
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniType<const std::u16string*>(
JNIEnv* env,
const std::u16string* const& input) {
if (!input) {
return nullptr;
}
return base::android::ConvertUTF16ToJavaString(env, *input);
}
template <>
BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniType<std::u16string_view>(
JNIEnv* env,

@ -759,21 +759,6 @@ struct ConvertArray<ContainerType> {
private:
using ElementType = std::remove_const_t<typename ContainerType::value_type>;
static ScopedJavaLocalRef<jobject> ElementToJniType(
JNIEnv* env,
const ElementType& element) {
if constexpr (std::is_pointer_v<ElementType> &&
!std::is_fundamental_v<std::remove_pointer_t<ElementType>>) {
// Dereference object pointers to enable using vector<ContainerType*>
// in order to avoid copying objects for the sake of JNI.
return jni_zero::ToJniType<
std::remove_const_t<std::remove_pointer_t<ElementType>>>(env,
*element);
} else {
return jni_zero::ToJniType<ElementType>(env, element);
}
}
public:
static ContainerType FromJniType(JNIEnv* env,
const JavaRef<jobjectArray>& j_array) {
@ -822,7 +807,8 @@ struct ConvertArray<ContainerType> {
if constexpr (std::is_base_of_v<JavaRef<jobject>, ElementType>) {
env->SetObjectArrayElement(j_array, i, value.obj());
} else {
ScopedJavaLocalRef<jobject> element = ElementToJniType(env, value);
ScopedJavaLocalRef<jobject> element =
jni_zero::ToJniType<ElementType>(env, value);
env->SetObjectArrayElement(j_array, i, element.obj());
}
++i;

@ -38,6 +38,17 @@ COMPONENT_EXPORT(URL)
ScopedJavaLocalRef<jobject> ToJniType<GURL>(JNIEnv* env, const GURL& gurl) {
return url::GURLAndroid::FromNativeGURL(env, gurl);
}
// Enables vector<const GURL*> to avoid copies.
template <>
COMPONENT_EXPORT(URL)
ScopedJavaLocalRef<jobject> ToJniType<const GURL*>(JNIEnv* env,
const GURL* const& gurl) {
if (!gurl) {
return nullptr;
}
return url::GURLAndroid::FromNativeGURL(env, *gurl);
}
} // namespace jni_zero
namespace url {