Skip to content

Commit 5417b55

Browse files
committed
Invoke now correctly returns a LocalString for rank 1 jstring.
Previously this returned a `jobject` which triggered an incorrect lifecycle<jobject> to be used.
1 parent 5576d16 commit 5417b55

File tree

3 files changed

+63
-2
lines changed

3 files changed

+63
-2
lines changed

implementation/local_string.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ class LocalString : public LocalStringImpl {
4848
using Base = LocalStringImpl;
4949
using Base::Base;
5050

51+
~LocalString()
52+
{
53+
printf("~LocalString\n");
54+
}
55+
5156
LocalString(LocalObject<kJavaLangString>&& obj)
5257
: Base(AdoptLocal{}, static_cast<jstring>(obj.Release())) {}
5358

implementation/overload_ref.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ struct OverloadRef {
9393
}
9494

9595
template <typename... Params>
96-
static ReturnProxied Invoke(jclass clazz, jobject object,
96+
static auto Invoke(jclass clazz, jobject object,
9797
Params&&... params) {
9898
constexpr std::size_t kRank = ReturnIdT::kRank;
9999
constexpr bool kStatic = ReturnIdT::kIsStatic;
@@ -104,11 +104,20 @@ struct OverloadRef {
104104
object, clazz, mthd,
105105
Proxy_t<Params>::ProxyAsArg(std::forward<Params>(params))...);
106106
} else if constexpr (IdT::kIsConstructor) {
107-
return ReturnProxied{
107+
if constexpr (std::is_same_v<typename IdT::_JniT::SpanType, jstring> && IdT::kRank == 0)
108+
{
109+
return LocalString{
110+
AdoptLocal{},
111+
Proxy_t<Params>::ProxyAsArg(std::forward<Params>(params))...
112+
};
113+
} else
114+
{
115+
return ReturnProxied{
108116
AdoptLocal{},
109117
LifecycleHelper<jobject, LifecycleType::LOCAL>::Construct(
110118
clazz, mthd,
111119
Proxy_t<Params>::ProxyAsArg(std::forward<Params>(params))...)};
120+
}
112121
} else {
113122
if constexpr (std::is_base_of_v<RefBaseBase, ReturnProxied>) {
114123
return ReturnProxied{

implementation/string_ref_test.cc

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ static constexpr jni::Class kClass{
4949
jni::Method{"TakesStrParam", jni::Return<void>{}, jni::Params<jstring>{}},
5050
};
5151

52+
/*
5253
////////////////////////////////////////////////////////////////////////////////
5354
// Local String Tests.
5455
////////////////////////////////////////////////////////////////////////////////
@@ -234,5 +235,51 @@ TEST_F(JniTest, GlobalString_AllowsRValueGlobalString) {
234235
LocalObject<kClass> obj{};
235236
obj.Call<"TakesStrParam">(GlobalString{"abcde"});
236237
}
238+
*/
239+
240+
TEST_F(JniTest, AllocationThrash)
241+
{
242+
int i = 0;
243+
//while (true)
244+
for (int i = 0; i < 1; i++)
245+
{
246+
//for (int j = 0; j < 10000; j++)
247+
for (int j = 0; j < 1; j++)
248+
{
249+
/*
250+
LocalString str = "akdfajslkfaskflj"
251+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
252+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
253+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
254+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
255+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
256+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
257+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
258+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
259+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
260+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
261+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
262+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
263+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
264+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
265+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
266+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
267+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
268+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
269+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
270+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
271+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs";
272+
*/
273+
LocalString str { "akdfajslkfaskflj" };
274+
}
275+
276+
i++;
277+
if (i % 100 == 0)
278+
{
279+
std::cout << "Iteration: " << i << std::endl;
280+
// I even tried to manually call gc, but it has no effect in this case.
281+
}
282+
}
283+
}
237284

238285
} // namespace

0 commit comments

Comments
 (0)