Embeddinator-4000 icon indicating copy to clipboard operation
Embeddinator-4000 copied to clipboard

[Android] Calling into C# on a different thread fails

Open Zomb opened this issue 7 years ago • 6 comments

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

Zomb avatar Jul 14 '17 14:07 Zomb

Thanks @Zomb I will look into this.

Can you paste a snippet of your Java code?

jonathanpeppers avatar Jul 14 '17 15:07 jonathanpeppers

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.

Zomb avatar Jul 14 '17 15:07 Zomb

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.

jonathanpeppers avatar Jul 14 '17 18:07 jonathanpeppers

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!

Zomb avatar Jul 21 '17 02:07 Zomb

@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 avatar Jan 04 '18 13:01 emysa341

@emysa341 did you find any solution to generate all methods while inheriting from Java.Lang.Obj?

johannperez avatar Mar 21 '19 20:03 johannperez