Skip to content

Commit a6ee7ea

Browse files
author
Mihail Slavchev
committed
add tests for issue #72
1 parent a692243 commit a6ee7ea

File tree

9 files changed

+235
-6
lines changed

9 files changed

+235
-6
lines changed

src/jni/FieldAccessor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ Handle<Value> FieldAccessor::GetJavaField(const Handle<Object>& target, FieldCal
109109
JniLocalRef str(env.NewString(&result, 1));
110110
jboolean bol = true;
111111
const char* resP = env.GetStringUTFChars(str, &bol);
112-
env.ReleaseStringUTFChars(str, resP);
113112
fieldResult = handleScope.Escape(ConvertToV8String(resP, 1));
113+
env.ReleaseStringUTFChars(str, resP);
114114
break;
115115
}
116116
case 'S': //short

src/jni/JsArgToArrayConverter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,8 +293,8 @@ bool JsArgToArrayConverter::ConvertArg(const Handle<Value>& arg, int index)
293293
jchar value = '\0';
294294
if (hidden->IsString())
295295
{
296-
string value = ConvertToString(hidden->ToString());
297-
value = (jchar)value[0];
296+
string str = ConvertToString(hidden->ToString());
297+
value = (jchar)str[0];
298298
}
299299

300300
jclass clazz = env.FindClass("java/lang/Character");

src/jni/NativeScriptRuntime.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,8 @@ void NativeScriptRuntime::CallJavaMethod(const Handle<Object>& caller, const str
297297
JniLocalRef str(env.NewString(&result, 1));
298298
jboolean bol = true;
299299
const char* resP = env.GetStringUTFChars(str, &bol);
300-
env.ReleaseStringUTFChars(str, resP);
301300
args.GetReturnValue().Set(ConvertToV8String(resP, 1));
301+
env.ReleaseStringUTFChars(str, resP);
302302
break;
303303
}
304304
case 'S': //short

test-app/assets/app/mainpage.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ require("./tests/testIfAbleToRunExternalFile");
1616
require("./tests/finalFieldsSetTests");
1717
require("./tests/extendedClassesTests");
1818
require("./tests/extendClassNameTests");
19+
require("./tests/testJniReferenceLeak");
1920

2021

2122
var MainActivity = {
@@ -54,11 +55,14 @@ app.init({
5455
getActivity: function(activity) {
5556
var intent = activity.getIntent();
5657
__log("intent=" + intent)
57-
if (intent.getAction() == android.content.Intent.ACTION_MAIN) {
58+
var action = intent.getAction();
59+
__log("action=" + action)
60+
return MainActivity;
61+
if (action == android.content.Intent.ACTION_MAIN) {
5862
return MainActivity;
5963
}
6064
else {
61-
fail("Unknown action");
65+
__exit("Unknown action");
6266
}
6367
},
6468

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
describe("Tests JNI reference leak", function () {
2+
3+
// var myCustomEquality = function(first, second) {
4+
// return first == second;
5+
// };
6+
//
7+
// beforeEach(function() {
8+
// jasmine.addCustomEqualityTester(myCustomEquality);
9+
// });
10+
11+
it("test_if_method_param_marshalling_leaks", function () {
12+
13+
var test = new com.tns.tests.JniReferenceLeakTest(null);
14+
15+
var N = 10000;
16+
17+
for (var n=0; n<N; n++)
18+
{
19+
var c = 'x';
20+
expect(test.echoChar(char(c))).toBe(c);
21+
22+
var i = 5;
23+
expect(test.echoInt(i)).toBe(i);
24+
25+
var s = "hello";
26+
expect(test.echoString(s)).toBe(s);
27+
28+
var o = new java.lang.Object();
29+
expect(test.echoObject(o)).toBe(o);
30+
}
31+
32+
expect(n).toBe(N);
33+
});
34+
35+
it("test_if_field_access_marshalling_leaks", function () {
36+
37+
var test = new com.tns.tests.JniReferenceLeakTest(null);
38+
39+
var N = 10000;
40+
41+
for (var n=0; n<N; n++)
42+
{
43+
var c = 'x';
44+
test.charField = c;
45+
expect(test.charField).toBe(c);
46+
47+
test.intField = n;
48+
expect(test.intField).toBe(n);
49+
50+
var s = "hello" + n;
51+
test.stringField = s;
52+
expect(test.stringField).toBe(s);
53+
54+
var o = new java.lang.Object();
55+
test.objectField = o;
56+
expect(test.objectField).toBe(o);
57+
}
58+
59+
expect(n).toBe(N);
60+
});
61+
62+
it("test_if_callback_parameter_marshalling_leaks", function () {
63+
64+
var p = new com.tns.tests.JniReferenceLeakTest.Processor({
65+
echoChar: function(c) { return char(c); },
66+
echoInt: function(i) { return i; },
67+
echoString: function(s) { return s; },
68+
echoObject: function(o) { return o; },
69+
echoCharArray: function(arr) { return arr; },
70+
echoIntArray: function(arr) { return arr; },
71+
echoStringArray: function(arr) { return arr; },
72+
echoObjectArray: function(arr) { return arr; }
73+
});
74+
75+
76+
var test = new com.tns.tests.JniReferenceLeakTest(p);
77+
78+
var N = 10000;
79+
80+
for (var n=0; n<N; n++)
81+
{
82+
var c = 'x';
83+
expect(test.triggerEchoChar(char(c))).toBe(c);
84+
85+
var i = 5;
86+
expect(test.triggerEchoInt(i)).toBe(i);
87+
88+
var s = "hello";
89+
expect(test.triggerEchoString(s)).toBe(s);
90+
91+
var o = new java.lang.Object();
92+
expect(test.triggerEchoObject(o)).toBe(o);
93+
}
94+
95+
expect(n).toBe(N);
96+
});
97+
98+
99+
});
-37.5 KB
Binary file not shown.
-103 KB
Binary file not shown.
-193 KB
Binary file not shown.
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package com.tns.tests;
2+
3+
public class JniReferenceLeakTest {
4+
5+
public static interface Processor
6+
{
7+
char echoChar(char c);
8+
int echoInt(int i);
9+
String echoString(String s);
10+
Object echoObject(Object o);
11+
char[] echoCharArray(char[] arr);
12+
int[] echoIntArray(int[] arr);
13+
String[] echoStringArray(String[] arr);
14+
Object[] echoObjectArray(Object[] arr);
15+
}
16+
17+
private final Processor processor;
18+
19+
public JniReferenceLeakTest(Processor processor)
20+
{
21+
this.processor = processor;
22+
}
23+
24+
public byte byteField;
25+
public short shortField;
26+
public int intField;
27+
public long longField;
28+
public float floatField;
29+
public double doubleField;
30+
public char charField;
31+
public boolean booleanField;
32+
public String stringField;
33+
public Object objectField;
34+
35+
public char[] charArray;
36+
public int[] intArray;
37+
public String[] stringArray;
38+
public Object[] objectArray;
39+
40+
public char[][] charArray2;
41+
public int[][] intArray2;
42+
public String[][] stringArray2;
43+
public Object[][] objectArray2;
44+
45+
public char echoChar(char c)
46+
{
47+
return c;
48+
}
49+
50+
public int echoInt(int i)
51+
{
52+
return i;
53+
}
54+
55+
public String echoString(String s)
56+
{
57+
return s;
58+
}
59+
60+
public Object echoObject(Object o)
61+
{
62+
return o;
63+
}
64+
65+
public char[] echoCharArray(char[] arr)
66+
{
67+
return arr;
68+
}
69+
70+
public int[] echoIntArray(int[] arr)
71+
{
72+
return arr;
73+
}
74+
75+
public String[] echoStringArray(String[] arr)
76+
{
77+
return arr;
78+
}
79+
80+
public Object[] echoObjectArray(Object[] arr)
81+
{
82+
return arr;
83+
}
84+
85+
//
86+
87+
public char triggerEchoChar(char c)
88+
{
89+
return processor.echoChar(c);
90+
}
91+
92+
public int triggerEchoInt(int i)
93+
{
94+
return processor.echoInt(i);
95+
}
96+
97+
public String triggerEchoString(String s)
98+
{
99+
return processor.echoString(s);
100+
}
101+
102+
public Object triggerEchoObject(Object o)
103+
{
104+
return processor.echoObject(o);
105+
}
106+
107+
public char[] triggerEchoCharArray(char[] arr)
108+
{
109+
return processor.echoCharArray(arr);
110+
}
111+
112+
public int[] triggerEchoIntArray(int[] arr)
113+
{
114+
return processor.echoIntArray(arr);
115+
}
116+
117+
public String[] triggerEchoStringArray(String[] arr)
118+
{
119+
return processor.echoStringArray(arr);
120+
}
121+
122+
public Object[] triggerEchoObjectArray(Object[] arr)
123+
{
124+
return processor.echoObjectArray(arr);
125+
}
126+
}

0 commit comments

Comments
 (0)