-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Loading jnidispatch on Android 15 with 16 KB page size leads to crash #1647
Comments
This should have fixed the issue: 17f4e59 It is unclear why it does not and it is unclear why that was not found when testing. This needs someone with interest in Android and willing to see where this goes wrong. |
I can't reproduce the problem. I modified the Log.d("MY_LOGS", "Loading library jnidispatch")
System.loadLibrary("jnidispatch") // This causes crash on Android 15 emulator with 16 KB page size
var p = Runtime.getRuntime().exec(arrayOf("getconf", "PAGE_SIZE"));
p.waitFor();
var pageSize = p.inputStream.readAllBytes().toString(Charsets.UTF_8);
Log.d("MY_LOGS", "jnidispatch is loaded. Version: " + Native.VERSION + " / Version Native: " + Native.VERSION_NATIVE + " / Page size: " + pageSize); And get the expected result
This looks sane to me. I can not check on arm64 though as the emulator can't be started:
|
What device (or emulator) do you use for testing? With x64 architecture? I check your code on my Google Pixel 9 ARM64 physical device with 4 KB page size and 16 KB page size, I recorded videos to show this behaviour: https://drive.google.com/drive/folders/12vZfRMl4FKeDgM4lqOTGZLhHY_KK54G-?usp=sharing |
@lisa-bella97 I used the emulator for x86-64. Google did not only decided to break ABI they also ensured, that it is ugly to debug. The emulator is not able to emulate arm64 on x86-64 (at least it claims so and starting does not work). My Pixel 7a is not among the few blessed devises that can be switched to 16k mode, so that ends my journey. |
FYI, NDK r28 was released today which enables 16KB page size by default. Maybe worth rebuilding with that? |
When I call this code in the onCreate, D Loading library jnidispatch
D Load /data/app/~~jaqWmGyrcRhNN-TDaAtWMw==/io.github.kingsword09.dweblib-u2Sivirptb7GzpkKIiFQOQ==/base.apk!/lib/arm64-v8a/libjnidispatch.so using class loader ns clns-7 (caller=/data/data/io.github.kingsword09.dweblib/code_cache/.overlay/base.apk/classes3.dex): ok
A Fatal signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x7e479e57e590 in tid 5410 (sword09.dweblib), pid 5410 (sword09.dweblib) After commenting out jnidispatch is loaded. Version: 5.16.0 / Version Native: 7.0.3 / Page size: 16384 my arm64 emulator:
|
When I use an x86-64 emulator, everything works fine. |
@matthiasblaesing Is there a way to get a build created with NDK r28 to see if that improves things? |
@rvandermeulen currently the android native binaries are build with NDK 12b. If I remember correctly at some point google switched from gcc to llvm. I have doubts, that newer SDKs can currently build JNA. |
Reading the Android docs again , I just noticed this bit:
Oddly, I can't find any usage of |
The note above mentioning Here's a GH mirror of the fix, since gitweb can be very slow: bminor/binutils-gdb@74e315d This tracks with what I noticed looking at the ELF alignment in |
@BugsBeGone if you tell me where to modify the Makefile, I'll create an updated build. |
@matthiasblaesing I'd love to test this, but don't have any new enough devices. Since @lisa-bella97 found it on real hardware, maybe they can check on ones we know for sure have crashed already? I think putting
Also not sure if the previous |
Ah, of course, you still want testing on x86-64 VMs to work. As it happens, recent NDKs just always set 64-bit targets for ARM and x86 to default to 16KB: https://android.googlesource.com/platform/ndk/+/02d2d9adccdf353bcea0a678c28b3de62dc2cf33^!/ So perhaps then, the fix is to remove
Keeping them separate also makes it easier for custom builds to undo the change only for x86-64, if that does causes any problems. |
Not to go off topic, but it can't be a coincidence that the note about Edit: I finally found the bug tracker for the docs. Here is the issue that prompted adding the note. |
Suggested by (@BugsBeGone): java-native-access#1647 (comment) java-native-access#1647 (comment) Supported by: https://issuetracker.google.com/issues/372503468#comment1 https://archive.fosdem.org/2024/events/attachments/fosdem-2024-2340-linker-scripts-in-lld-and-how-they-compare-with-gnu-ld/slides/22752/Fosdem_linker_scripts_2024_uG7XLOI.pdf Closes: java-native-access#1647
@BugsBeGone thank you for the reference and idea. Based on your suggestion I updated the original change to include the A prebuild binary can be found here: jna.zip (JAR and AAR are both included). It would be great if the people having access to an aarch64 emulator could test this (and also the ones just doing android development) |
Found a way to test it on aarch64 emulator, with the sample of this issue, and it seems to have fixed it, well done @BugsBeGone.
Interesting, it explains why I didn't see it when doing the first fix attempt. |
Also tested it now with provided jna.aar binary and it finally works now on arm64 emulators running on macOS (M3 MacBook). Previous versions resulted in app crashing on Android 15 with 16KB page size, with same SIGSEGV crash as already reported. I am using it to load libsodium binaries for Android app, and for now it all seems to work fine on other Android versions as well. |
Eventually managed to get a 16KB page size x64 VM to work with arm64
Also, only the Google API & Play Store (typically larger) images support ARM translation: https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html Edit: If you use API level 28 (9.0) or 30 (11.0) images with ARM translation, they should work with native 32-bit arm & x86 libs as well: But of course, you can't test the new 16 KB page size requirement on images that old. |
When will the correct 16kb jna version be released? Our app strongly depends on this so~~ |
@matthiasblaesing Just curious, is there an ETA on the 5.17.0 release? Not sure what your release cadence normally is 😄 |
Release 5.17.0 is out. I wanted to have a look at some other things, but time ran out, so just a small release. |
Thank you very much! Appreciate all the hard work you do to maintain this dependency! |
5.16.0@aar
ART, Android 15
System.getProperty("java.vm.version") = "2.1.0"
Android 15 with 16 KB page size
arm64-v8a
Loading jnidispatch using
System.loadLibrary("jnidispatch")
is OK on Android 15 or less with 4 KB page size, but is not OK (leads to SIGSEGV crash) on Android 15 with 16 KB page size (support of this page size in Android 15 is described in docs).System.loadLibrary("jnidispatch")
is called on Android platform inloadNativeDispatchLibrary
function that is called in static block of JNA classNative
, so you cannot properly use, for example,Native.load
function on Android 15 with 16 KB page size.To test this behaviour, we used the corresponding Android Studio emulator and Google Pixel 8 and Google Pixel 9 physical devices with 16 KB mode enabled.
Info about emulator:
Emulator version: 35.1.13-11943732 (HVF 14.5.0)
Host machine: macOS 14.5
Api level: 35
Type: Google APIs PlayStore Page Size 16 KB
Info about Google Pixel 8:
Api level: 35
Build number: AP41.240925.009
Info about Google Pixel 9:
Api level: 35
Build number: BP11.241121.010
You can find minimal sample here. Launching this app on Android 15, 16-KB-based emulator or some Google Pixel physical devices with 16 KB mode enabled will lead to SIGSEGV crash, full log with dump.
Related issue: #1618
The text was updated successfully, but these errors were encountered: