Embeddinator-4000
Embeddinator-4000 copied to clipboard
[Android] Calling into C# on a different thread fails
If you attempt to create an instance of the C# object in Android Studio inside a thread other than the main thread, using new Thread or AsyncTask, results in a crash with (some) of the trace seen below:
5-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: /proc/self/maps: 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 12c00000-12c8a000 rw-p 00000000 00:04 17384 /dev/ashmem/dalvik-main space (deleted) 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 12c8a000-12e8a000 rw-p 0008a000 00:04 17384 /dev/ashmem/dalvik-main space (deleted) 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 12e8a000-22c00000 ---p 0028a000 00:04 17384 /dev/ashmem/dalvik-main space (deleted) 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 32c00000-32c01000 rw-p 00000000 00:04 17385 /dev/ashmem/dalvik-main space 1 (deleted) 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 32c01000-42c00000 ---p 00001000 00:04 17385 /dev/ashmem/dalvik-main space 1 (deleted) 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 70a1b000-70cba000 rw-p 00000000 103:13 1155537 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 70cba000-70e36000 rw-p 00000000 103:13 1155538 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 70e36000-70e6b000 rw-p 00000000 103:13 1155539 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 70e6b000-70ea4000 rw-p 00000000 103:13 1155540 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 70ea4000-70ea7000 rw-p 00000000 103:13 1155541 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 70ea7000-70eed000 rw-p 00000000 103:13 1155542 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 70eed000-70f2f000 rw-p 00000000 103:13 1155543 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 70f2f000-716ee000 rw-p 00000000 103:13 1155544 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 716ee000-71780000 rw-p 00000000 103:13 1155545 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 71780000-71788000 rw-p 00000000 103:13 1155546 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 71788000-71794000 rw-p 00000000 103:13 1155547 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 71794000-717b7000 rw-p 00000000 103:13 1155548 /data/dalvik-cache/arm64/system@[email protected] 07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 717b7000-717de000 rw-p 00000000 103:13 1155549
Thanks @Zomb I will look into this.
Can you paste a snippet of your Java code?
I tried two methods:
new Thread(() -> {
AndroidLibWrapper x = new AndroidLibWrapper();
}).start();
and
class Controller extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
AndroidLibWrapper x = new AndroidLibWrapper();
return null;
}
}
Controller a = new Controller();
a.execute();
The C# library I am calling into is Mono.Android library.
I'm seeing this, too.
One workaround for now is to subclass Java.Lang.Object
.
I have this C#:
[Register("mono.embeddinator.android.SubclassJava")]
public class SubclassJava : Java.Lang.Object { }
Then my test in Java:
@Test
public void thread() {
new Thread(() -> {
try {
SubclassJava obj = new SubclassJava();
obj.toString();
} catch (Throwable e) {
//apparently Java lambdas don't do checked exceptions
throw new RuntimeException(e);
}
}).start();
}
This case works, but if it isn't Java.Lang.Object
, it crashes.
I will research if this just needs to be a limitation or if it can be fixed.
This method does work, and I have no crashes when I create a thread. In the process of testing this out a couple of days ago, I ran into a particular problem related to the Register attribute. If the specified package is in camel case (Register("MoNo.embed.SubclassJava")) then Android Studio had problems using the class. This has nothing to do with the thread though, and if I find more information on the problem, I will create a new issue!
@jonathanpeppers I have a same issue, during Emebeddination process I am getting this Note: AndroidEmbeded.java uses unchecked or unsafe operations. Recompile with -Xlint:unchecked for details. However, my Embeddination is successfull and I am getting AAR file. In AAR file the AndroidEmbeded.java is accessble and I can create instance but Embeddination do not generates any methods which are present in AndroidEmbeded.java. @Zomb Were you able to generate all methods while inhereting from Java.Lang.Obj?
@emysa341 did you find any solution to generate all methods while inheriting from Java.Lang.Obj?