Skip to content
This repository has been archived by the owner on Oct 25, 2021. It is now read-only.

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

Open
Zomb opened this issue Jul 14, 2017 · 6 comments
Open

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

Zomb opened this issue Jul 14, 2017 · 6 comments
Milestone

Comments

@Zomb
Copy link

Zomb commented Jul 14, 2017

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@framework@boot.art
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@framework@boot-core-libart.art
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@framework@boot-conscrypt.art
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@framework@boot-okhttp.art
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@framework@boot-core-junit.art
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@framework@boot-bouncycastle.art
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@framework@boot-ext.art
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@framework@boot-framework.art
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@framework@boot-telephony-common.art
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@framework@boot-voip-common.art
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@framework@boot-ims-common.art
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@framework@boot-apache-xml.art
07-14 08:59:46.309 28595-28808/com.starkey.android.newlink.nativeandroid E/mono-rt: 717b7000-717de000 rw-p 00000000 103:13 1155549

@jonathanpeppers
Copy link
Member

Thanks @Zomb I will look into this.

Can you paste a snippet of your Java code?

@Zomb
Copy link
Author

Zomb commented Jul 14, 2017

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.

@jonathanpeppers
Copy link
Member

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.

@Zomb
Copy link
Author

Zomb commented Jul 21, 2017

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!

@emysa341
Copy link

emysa341 commented Jan 4, 2018

@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?

@chamons chamons added the java label Mar 19, 2018
@rolfbjarne rolfbjarne added this to the Future milestone Sep 4, 2018
@johannperez
Copy link

johannperez commented Mar 21, 2019

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

7 participants