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:

committed by
Chromium LUCI CQ

parent
e119e5eeed
commit
f40ebf9f5c
@ -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,
|
||||
|
18
third_party/jni_zero/jni_zero.h
vendored
18
third_party/jni_zero/jni_zero.h
vendored
@ -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 {
|
||||
|
Reference in New Issue
Block a user