mirror of
https://github.com/netbirdio/gomobile-tvos-fork.git
synced 2026-05-22 18:43:29 -07:00
bind/java: pin java byte array elements until Seq send is done.
When passing a byte array from Java to Go, Seq.writeByteArray JNI call encodes only the array size and the pointer to the array. Go-side receives the (size, ptr) pair info during the subsequent Seq.send JNI call, and copies the elements into a Go byte slice. We must pin the array elements until Go-side completes copying so that they are not moved or collected by Java runtime. This change keeps track of the pinned array info in a 'pinned' linked list, and unpin them as the Seq memory is freed. The jbyteArray argument passed to Seq.writeByteArray is needed to release the pinned byte array elements, but that is a "local reference". It is not guaranteed that the reference is valid after the method returns. Thus, we stash its global reference in the 'pinned' list and delete it later as well. A similar problem can occur on the byte slice returned from a Go function. This change does not address the case yet. Fixes golang/go#9486 Change-Id: I1255aefbc80b21ccbe9b2bf37699faaf0c5f0bae Reviewed-on: https://go-review.googlesource.com/2586 Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
committed by
Hyang-Ah Hana Kim
parent
d97f4d82bd
commit
71e2276663
@@ -81,6 +81,27 @@ public class SeqTest extends TestCase {
|
||||
}
|
||||
}
|
||||
|
||||
// Test for golang.org/issue/9486.
|
||||
public void testByteArrayAfterString() {
|
||||
byte[] bytes = new byte[1024];
|
||||
for (int i=0; i < bytes.length; i++) {
|
||||
bytes[i] = 8;
|
||||
}
|
||||
|
||||
String stuff = "stuff";
|
||||
byte[] got = Testpkg.AppendToString(stuff, bytes);
|
||||
|
||||
try {
|
||||
byte[] s = stuff.getBytes("UTF-8");
|
||||
byte[] want = new byte[s.length + bytes.length];
|
||||
System.arraycopy(s, 0, want, 0, s.length);
|
||||
System.arraycopy(bytes, 0, want, s.length, bytes.length);
|
||||
MoreAsserts.assertEquals("Bytes should match", want, got);
|
||||
} catch (Exception e) {
|
||||
fail("Cannot perform the test: " + e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public void testGoRefGC() {
|
||||
Testpkg.S s = Testpkg.New();
|
||||
runGC();
|
||||
|
||||
Reference in New Issue
Block a user