jnr / jnr-ffi

Java Abstracted Foreign Function Layer
Other
1.25k stars 156 forks source link

Throws NullPointerException when running on Android Emulator #173

Open jollyjoker992 opened 6 years ago

jollyjoker992 commented 6 years ago

I debug and know that this line causes the java NullPointerException when running in Android emulator. It's specific from Sun ? Why don't you make it more common with another solution?

Full stack trace

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.jollyjoker992.xxx, PID: 25751 java.lang.ExceptionInInitializerError at jnr.ffi.Platform.getNativePlatform(Platform.java:292) at cryptography.crypto.libsodium.LibSodium.libraryName(LibSodium.java:36) at cryptography.crypto.libsodium.LibSodium.(LibSodium.java:15) at cryptography.crypto.libsodium.LibSodium.sodium(LibSodium.java:23) at cryptography.crypto.SecretBox.generateSecretBox(SecretBox.java:27) at sdk.features.Account.generateKeyPair(Account.java:105) at sdk.features.Account.fromSeed(Account.java:47) at com.example.jollyjoker992.xxx.MainActivity.onCreate(MainActivity.kt:21) at android.app.Activity.performCreate(Activity.java:6679) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference at jnr.ffi.Platform.calculateAddressSize(Platform.java:262) at jnr.ffi.Platform.(Platform.java:257) at jnr.ffi.Platform.(Platform.java:29) at jnr.ffi.Platform$Supported.(Platform.java:415) at jnr.ffi.Platform$Linux.(Platform.java:464) at jnr.ffi.Platform.determinePlatform(Platform.java:173) at jnr.ffi.Platform.determinePlatform(Platform.java:189) at jnr.ffi.Platform.access$000(Platform.java:29) at jnr.ffi.Platform$SingletonHolder.(Platform.java:38) at jnr.ffi.Platform.getNativePlatform(Platform.java:292)  at cryptography.crypto.libsodium.LibSodium.libraryName(LibSodium.java:36)  at cryptography.crypto.libsodium.LibSodium.(LibSodium.java:15)  at cryptography.crypto.libsodium.LibSodium.sodium(LibSodium.java:23)  at cryptography.crypto.SecretBox.generateSecretBox(SecretBox.java:27)  at sdk.features.Account.generateKeyPair(Account.java:105)  at sdk.features.Account.fromSeed(Account.java:47)  at com.example.jollyjoker992.xxx.MainActivity.onCreate(MainActivity.kt:21)  at android.app.Activity.performCreate(Activity.java:6679)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6119)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

tomholub commented 5 years ago

also happening here on Android

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
        at jnr.ffi.Platform.calculateAddressSize(Platform.java:262)
        at jnr.ffi.Platform.<init>(Platform.java:257)
        at jnr.ffi.Platform.<init>(Platform.java:29)
        at jnr.ffi.Platform$Supported.<init>(Platform.java:415)
        at jnr.ffi.Platform$Linux.<init>(Platform.java:464)
        at jnr.ffi.Platform.determinePlatform(Platform.java:173)
        at jnr.ffi.Platform.determinePlatform(Platform.java:189)
        at jnr.ffi.Platform.access$000(Platform.java:29)
        at jnr.ffi.Platform$SingletonHolder.<clinit>(Platform.java:38)
        at jnr.ffi.Platform.getNativePlatform(Platform.java:292) 
        at jnr.unixsocket.Native.<clinit>(Native.java:46) 
        at jnr.unixsocket.Native.socket(Native.java:92) 
        at jnr.unixsocket.UnixSocketChannel.<init>(UnixSocketChannel.java:101) 
        at jnr.unixsocket.UnixSocketChannel.open(UnixSocketChannel.java:60) 
tomholub commented 5 years ago

related https://github.com/jnr/jffi/issues/57

tomholub commented 5 years ago

I think this issue can be closed, as the fix above got merged

EternalDeiwos commented 5 years ago

@tomholub @headius I'm not so sure... I've been trying to get this very basic example running and having the same issue as OP with jnr-ffi v2.1.10 in the Android Emulator.

// MainActivity.java
// ...
    public interface LibC {
        @pid_t
        long getpid();

        @pid_t
        long getppid();
    }

    static {
        LibC lib = LibraryLoader.create(LibC.class).load("c");
        Log.d("JNR_TEST", "result: " + lib.getpid() + "/" + lib.getppid());
    }
// ...

While I've got a testing project set up is there anything else you'd like me to try?

EternalDeiwos commented 5 years ago

Just tried running it on an actual android device as well (arm8 / aarch64), this is the latter part of the logcat output.

I have a suspicion that this line has something to do with it:

java.lang.UnsatisfiedLinkError: could not locate stub library in jar file. Tried [jni/aarch64-Linux/libjffi-1.2.so, /jni/aarch64-Linux/libjffi-1.2.so]

Related to jnr/jffi#69 perhaps?

Log ``` 2019-09-17 19:36:24.257 12259-12259/com.jnrpid D/SoLoader: init finish: 4 SO sources prepared 2019-09-17 19:36:24.257 12259-12259/com.jnrpid D/SoLoader: init exiting 2019-09-17 19:36:24.288 12259-12301/com.jnrpid D/libEGL: loaded /vendor/lib64/egl/libGLES_mali.so 2019-09-17 19:36:24.326 12259-12259/com.jnrpid D/AndroidRuntime: Shutting down VM 2019-09-17 19:36:24.328 12259-12259/com.jnrpid E/AndroidRuntime: FATAL EXCEPTION: main Process: com.jnrpid, PID: 12259 java.lang.UnsatisfiedLinkError: could not load FFI provider jnr.ffi.provider.jffi.Provider at jnr.ffi.provider.InvalidProvider$1.loadLibrary(InvalidProvider.java:48) at jnr.ffi.LibraryLoader.load(LibraryLoader.java:325) at jnr.ffi.LibraryLoader.load(LibraryLoader.java:304) at com.jnrpid.MainActivity.(MainActivity.java:30) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:43) at android.app.Instrumentation.newActivity(Instrumentation.java:1215) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3007) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3256) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1947) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7037) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) Caused by: java.lang.UnsatisfiedLinkError: could not get native definition for type: POINTER at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:251) at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) at com.kenai.jffi.Type.resolveSize(Type.java:155) at com.kenai.jffi.Type.size(Type.java:138) at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178) at jnr.ffi.provider.AbstractRuntime.(AbstractRuntime.java:48) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:57) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:41) at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.(NativeRuntime.java:53) at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49) at jnr.ffi.provider.jffi.Provider.(Provider.java:29) at java.lang.Class.newInstance(Native Method) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.(FFIProvider.java:57) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.access$000(FFIProvider.java:56) at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) at jnr.ffi.LibraryLoader.create(LibraryLoader.java:73) at com.jnrpid.MainActivity.(MainActivity.java:30)  at java.lang.Class.newInstance(Native Method)  at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69)  at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:43)  at android.app.Instrumentation.newActivity(Instrumentation.java:1215)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3007)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3256)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1947)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:214)  at android.app.ActivityThread.main(ActivityThread.java:7037)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)  Caused by: java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: could not locate stub library in jar file. Tried [jni/aarch64-Linux/libjffi-1.2.so, /jni/aarch64-Linux/libjffi-1.2.so] at com.kenai.jffi.internal.StubLoader.getStubLibraryStream(StubLoader.java:421) at com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:363) at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:266) at com.kenai.jffi.internal.StubLoader.(StubLoader.java:458) at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:453) at com.kenai.jffi.Init.load(Init.java:68) at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49) at com.kenai.jffi.Foreign$InstanceHolder.(Foreign.java:45) at com.kenai.jffi.Foreign.getInstance(Foreign.java:103) at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242) at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) at com.kenai.jffi.Type.resolveSize(Type.java:155) at com.kenai.jffi.Type.size(Type.java:138) at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178) 2019-09-17 19:36:24.328 12259-12259/com.jnrpid E/AndroidRuntime: at jnr.ffi.provider.AbstractRuntime.(AbstractRuntime.java:48) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:57) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:41) at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.(NativeRuntime.java:53) at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49) at jnr.ffi.provider.jffi.Provider.(Provider.java:29) at java.lang.Class.newInstance(Native Method) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.(FFIProvider.java:57) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.access$000(FFIProvider.java:56) at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) at jnr.ffi.LibraryLoader.create(LibraryLoader.java:73) at com.jnrpid.MainActivity.(MainActivity.java:30) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:43) at android.app.Instrumentation.newActivity(Instrumentation.java:1215) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3007) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3256) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1947) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7037) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) at com.kenai.jffi.Foreign.newLoadError(Foreign.java:72) at com.kenai.jffi.Foreign.access$300(Foreign.java:42) at com.kenai.jffi.Foreign$InValidInstanceHolder.getForeign(Foreign.java:98) at com.kenai.jffi.Foreign.getInstance(Foreign.java:103) at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242) ... 33 more Caused by: java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: could not locate stub library in jar file. Tried [jni/aarch64-Linux/libjffi-1.2.so, /jni/aarch64-Linux/libjffi-1.2.so] at com.kenai.jffi.internal.StubLoader.getStubLibraryStream(StubLoader.java:421) at com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:363) at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:266) at com.kenai.jffi.internal.StubLoader.(StubLoader.java:458) at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:453) at com.kenai.jffi.Init.load(Init.java:68) at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49) at com.kenai.jffi.Foreign$InstanceHolder.(Foreign.java:45) at com.kenai.jffi.Foreign.getInstance(Foreign.java:103) at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242) at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) at com.kenai.jffi.Type.resolveSize(Type.java:155) at com.kenai.jffi.Type.size(Type.java:138) at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178) at jnr.ffi.provider.AbstractRuntime.(AbstractRuntime.java:48) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:57) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:41) at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.(NativeRuntime.java:53) at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49) at jnr.ffi.provider.jffi.Provider.(Provider.java:29) 2019-09-17 19:36:24.328 12259-12259/com.jnrpid E/AndroidRuntime: at java.lang.Class.newInstance(Native Method) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.(FFIProvider.java:57) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.access$000(FFIProvider.java:56) at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) at jnr.ffi.LibraryLoader.create(LibraryLoader.java:73) at com.jnrpid.MainActivity.(MainActivity.java:30) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:69) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:43) at android.app.Instrumentation.newActivity(Instrumentation.java:1215) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3007) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3256) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1947) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7037) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:278) at com.kenai.jffi.internal.StubLoader.(StubLoader.java:458) at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:453) at com.kenai.jffi.Init.load(Init.java:68) at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49) at com.kenai.jffi.Foreign$InstanceHolder.(Foreign.java:45) ... 35 more ```
headius commented 4 years ago

@EternalDeiwos Can you push your testing project somewhere? I can try to reproduce locally.

EternalDeiwos commented 4 years ago

@headius https://github.com/EternalDeiwos/jnrpid 🙇

EternalDeiwos commented 4 years ago

Hello; just checking if there has been any further thoughts on this. I reconfigured my test project (linked above) for Android API 29 and tried to run the same example code with jnr-ffi 2.1.16 and 2.2.0. This produced similar errors to the ones mentioned previously:

Logs (2.1.16) ``` 2020-10-02 17:57:32.794 30296-30296/com.example.jnrpid E/Zygote: isWhitelistProcess - Process is Whitelisted 2020-10-02 17:57:32.795 30296-30296/com.example.jnrpid E/Zygote: accessInfo : 1 2020-10-02 17:57:32.801 30296-30296/com.example.jnrpid I/.example.jnrpi: Late-enabling -Xcheck:jni 2020-10-02 17:57:32.824 30296-30296/com.example.jnrpid E/.example.jnrpi: Unknown bits set in runtime_flags: 0x8000 2020-10-02 17:57:32.834 30296-30296/com.example.jnrpid D/ActivityThread: setConscryptValidator 2020-10-02 17:57:32.834 30296-30296/com.example.jnrpid D/ActivityThread: setConscryptValidator - put 2020-10-02 17:57:32.941 30296-30296/com.example.jnrpid D/AndroidRuntime: Shutting down VM 2020-10-02 17:57:32.942 30296-30296/com.example.jnrpid E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.jnrpid, PID: 30296 java.lang.UnsatisfiedLinkError: could not load FFI provider jnr.ffi.provider.jffi.Provider at jnr.ffi.provider.InvalidProvider$1.loadLibrary(InvalidProvider.java:48) at jnr.ffi.LibraryLoader.load(LibraryLoader.java:392) at jnr.ffi.LibraryLoader.load(LibraryLoader.java:371) at com.example.jnrpid.MainActivity.(MainActivity.java:28) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:41) at android.app.Instrumentation.newActivity(Instrumentation.java:1251) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3436) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3707) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2220) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:237) at android.app.ActivityThread.main(ActivityThread.java:8016) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076) Caused by: java.lang.UnsatisfiedLinkError: could not get native definition for type `POINTER`, original error message follows: java.lang.UnsatisfiedLinkError: could not locate stub library in jar file. Tried [jni/aarch64-Linux/libjffi-1.2.so, /jni/aarch64-Linux/libjffi-1.2.so] at com.kenai.jffi.internal.StubLoader.getStubLibraryStream(StubLoader.java:450) at com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:375) at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:278) at com.kenai.jffi.internal.StubLoader.(StubLoader.java:487) at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:454) at com.kenai.jffi.Init.load(Init.java:68) at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49) at com.kenai.jffi.Foreign$InstanceHolder.(Foreign.java:45) at com.kenai.jffi.Foreign.getInstance(Foreign.java:103) at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242) at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) at com.kenai.jffi.Type.resolveSize(Type.java:155) at com.kenai.jffi.Type.size(Type.java:138) at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178) at jnr.ffi.provider.AbstractRuntime.(AbstractRuntime.java:48) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:57) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:41) at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.(NativeRuntime.java:53) at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49) at jnr.ffi.provider.jffi.Provider.(Provider.java:29) at java.lang.Class.newInstance(Native Method) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.(FFIProvider.java:57) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.access$000(FFIProvider.java:56) at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) at jnr.ffi.LibraryLoader.create(LibraryLoader.java:74) at com.example.jnrpid.MainActivity.(MainActivity.java:28) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:41) 2020-10-02 17:57:32.942 30296-30296/com.example.jnrpid E/AndroidRuntime: at android.app.Instrumentation.newActivity(Instrumentation.java:1251) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3436) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3707) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2220) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:237) at android.app.ActivityThread.main(ActivityThread.java:8016) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076) at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:253) at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) at com.kenai.jffi.Type.resolveSize(Type.java:155) at com.kenai.jffi.Type.size(Type.java:138) at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178) at jnr.ffi.provider.AbstractRuntime.(AbstractRuntime.java:48) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:57) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:41) at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.(NativeRuntime.java:53) at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49) at jnr.ffi.provider.jffi.Provider.(Provider.java:29) at java.lang.Class.newInstance(Native Method) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.(FFIProvider.java:57) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.access$000(FFIProvider.java:56) at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) at jnr.ffi.LibraryLoader.create(LibraryLoader.java:74) ... 17 more ```
Logs (2.2.0) ``` 2020-10-02 18:04:45.577 1138-1138/? E/Zygote: isWhitelistProcess - Process is Whitelisted 2020-10-02 18:04:45.578 1138-1138/? E/Zygote: accessInfo : 1 2020-10-02 18:04:45.582 1138-1138/? I/.example.jnrpi: Late-enabling -Xcheck:jni 2020-10-02 18:04:45.611 1138-1138/? E/.example.jnrpi: Unknown bits set in runtime_flags: 0x8000 2020-10-02 18:04:45.628 1138-1138/? D/ActivityThread: setConscryptValidator 2020-10-02 18:04:45.629 1138-1138/? D/ActivityThread: setConscryptValidator - put 2020-10-02 18:04:45.777 1138-1138/? D/AndroidRuntime: Shutting down VM 2020-10-02 18:04:45.778 1138-1138/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.jnrpid, PID: 1138 java.lang.UnsatisfiedLinkError: could not load FFI provider jnr.ffi.provider.jffi.Provider at jnr.ffi.provider.InvalidProvider$1.loadLibrary(InvalidProvider.java:48) at jnr.ffi.LibraryLoader.load(LibraryLoader.java:403) at jnr.ffi.LibraryLoader.load(LibraryLoader.java:382) at com.example.jnrpid.MainActivity.(MainActivity.java:28) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:41) at android.app.Instrumentation.newActivity(Instrumentation.java:1251) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3436) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3707) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2220) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:237) at android.app.ActivityThread.main(ActivityThread.java:8016) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076) Caused by: java.lang.UnsatisfiedLinkError: could not get native definition for type `POINTER`, original error message follows: java.lang.UnsatisfiedLinkError: could not locate stub library in jar file. Tried [jni/aarch64-Linux/libjffi-1.2.so, /jni/aarch64-Linux/libjffi-1.2.so] at com.kenai.jffi.internal.StubLoader.getStubLibraryStream(StubLoader.java:474) at com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:399) at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:300) at com.kenai.jffi.internal.StubLoader.(StubLoader.java:511) at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:454) at com.kenai.jffi.Init.load(Init.java:68) at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:50) at com.kenai.jffi.Foreign$InstanceHolder.(Foreign.java:46) at com.kenai.jffi.Foreign.getInstance(Foreign.java:104) at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242) at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) at com.kenai.jffi.Type.resolveSize(Type.java:155) at com.kenai.jffi.Type.size(Type.java:138) at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178) at jnr.ffi.provider.AbstractRuntime.(AbstractRuntime.java:48) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:57) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:41) at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.(NativeRuntime.java:53) at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49) at jnr.ffi.provider.jffi.Provider.(Provider.java:29) at java.lang.Class.newInstance(Native Method) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.(FFIProvider.java:57) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.access$000(FFIProvider.java:56) at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) at jnr.ffi.LibraryLoader.create(LibraryLoader.java:74) at com.example.jnrpid.MainActivity.(MainActivity.java:28) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:41) 2020-10-02 18:04:45.778 1138-1138/? E/AndroidRuntime: at android.app.Instrumentation.newActivity(Instrumentation.java:1251) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3436) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3707) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2220) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:237) at android.app.ActivityThread.main(ActivityThread.java:8016) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076) at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:253) at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) at com.kenai.jffi.Type.resolveSize(Type.java:155) at com.kenai.jffi.Type.size(Type.java:138) at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178) at jnr.ffi.provider.AbstractRuntime.(AbstractRuntime.java:48) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:57) at jnr.ffi.provider.jffi.NativeRuntime.(NativeRuntime.java:41) at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.(NativeRuntime.java:53) at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49) at jnr.ffi.provider.jffi.Provider.(Provider.java:29) at java.lang.Class.newInstance(Native Method) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.(FFIProvider.java:57) at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.access$000(FFIProvider.java:56) at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) at jnr.ffi.LibraryLoader.create(LibraryLoader.java:74) ... 17 more ```
headius commented 4 years ago

Hey I missed this stuff unfortunately but I'm catching up today.

headius commented 4 years ago

Based on the most recent errors from @EternalDeiwos my first guess would be that the native library part of jffi (the core of jnr) could not be unpacked to an executable location, so it could not be loaded.

jffi does have working support for aarch64-Linux, the platform mentioned in the error, but if that library is not already on the filesystem it must be unpacked from the jar. In terms of Android, I'm not sure exactly what the equivalent behavior would be. How do other Android apps deal with their JNI libraries? It may simply be a matter of injecting the native library into the right place in the application, but my knowledge of how Android apps are structured is limited.

Looping in @donv since he has been maintaining Ruboto and probably knows the answer to this.

EternalDeiwos commented 4 years ago

Ah; that could possibly make a bit of sense. My knowledge is also quite limited but I have been tinkering a little. Normally you'd just build the library into the app itself. I haven't done it with a prebuilt static lib yet but I have an idea of how to do that. I'll try some things and come back. Any additional suggestions appreciated.

If jffi actively tries to unpack libffi somewhere privileged then the Android OS would definitely block it from breaking its sandbox...

headius commented 4 years ago

@EternalDeiwos More recent jffi releases allow specifying a property to unpack the library somewhere else, but that directory would still need to permit loading executable code. Maybe that's helpful?

I suspect the app still needs to make Android aware of the extension, however, and probably pack it in the apk somewhere special.

EternalDeiwos commented 4 years ago

While poking around; I managed to discover something fairly interesting and I can't figure out what is causing it.

The jni folder inside my APK contains the jffi libraries for the following architectures:

These native libs are in the correct place to be loaded by android; however this list of architectures is notably missing those most necessary for android. I even rebuilt the current master branch's APK to confirm that it wasn't due to any changes I'd made so far. I don't know what makes these architectures special because I don't specify them anywhere in my code. Does this ring any bells?

Whatever is happening for these architectures is "the correct thing" that would be necessary for it to work for Android; it just needs to provide the appropriate architectures (and ideally not provide the ones that aren't necessary but that's a separate issue).

EternalDeiwos commented 4 years ago

So I added libffi-1.2 to my project manually (pushed here; not ideal but for good for testing) and I got past the error described above. See the new error below:

Logs ``` 2020-10-10 10:16:37.451 5338-5338/com.example.jnrpid E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.jnrpid, PID: 5338 java.lang.UnsatisfiedLinkError: dlopen failed: library "libc.so.6" not found at java.lang.Runtime.load0(Runtime.java:938) at java.lang.System.load(System.java:1631) at com.example.jnrpid.SharedLibraryLoader.loadLibrary(SharedLibraryLoader.java:44) at com.example.jnrpid.MainActivity.onCreate(MainActivity.java:20) at android.app.Activity.performCreate(Activity.java:7963) at android.app.Activity.performCreate(Activity.java:7952) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3629) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3806) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2267) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:237) at android.app.ActivityThread.main(ActivityThread.java:8167) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100) ```

This one I do happen to know the cause of; it depends on libc, which differs for standard linux and android even if built for the same architecture. The way around this is to create a build of libffi specifically for the android architectures which are compiled using the Android NDK. The good news -- related to jnr/jffi#69 -- is that there are docker images for this.

This of course still does not address why the desired binaries aren't being included in the build without having to manually copy in libffi; I'll keep digging on that.

headius commented 4 years ago

@EternalDeiwos This is great progress! Our FFI stub appears to be loading correctly now, at least well enough to attempt to find libc.

One thing that may be related: the necessary native library is installed via a separate maven artifact, and gets downloaded as as separate jar file. Here's a screenshot from search.maven.org showing the native jar artifacts:

Screen Shot 2020-10-12 at 13 18 42

It is somewhat confusing that libffi-2.0 would be the missing link here, since the native library that jffi ships should have libffi compiled statically into it.

I also ran across a tool+library today for packaging and loading native libraries from within jar files that could be useful to us if it covers our use cases better than the current ugly code: https://maven-nar.github.io/

Regarding libc... we do have several hacks/tricks in place to try to locate the libc library, which could be improved to support Android's filesystem layout. I am reminded of this issue for Ruby FFI, where we had to fix the JRuby version to always look for "libc.so.6" for reasons: https://github.com/ffi/ffi/issues/824

Let me know how your exploration goes. If necessary I can try to spin up an Android dev environment and look into this, but anything you can do is a great help. JFFI is largely maintained by the JRuby community, so you can chat with us on our Matrix channel: https://matrix.to/#/#jruby:matrix.org

bmbariah commented 3 years ago

Any update on this?

headius commented 3 years ago

@bmbariah Yeah I was kinda hoping to hear more back from folks attempting this. Are you having this issue? If I can reproduce it with an easy build or repository maybe we can find a way to fix it now.

jaycynth commented 3 years ago

Experiencing the same error, i've replicated my error in this repo https://github.com/jaycynth/PlatformJni.git

2246sam20 commented 2 years ago

Hello !@headius Any update on this? I am also getting the same error

headius commented 1 year ago

Hey, this bug wakes up again!

The problem here is most likely that it is not picking the right platform at that point, because Android is weird.

Can anyone step into the code at that point and see what the OS and CPU values coming back from the runtime actually are? We probably just need to figure out the right way to detect platform on Android.

headius commented 1 year ago

From what I can find online, the properties we need (os.name and os.arch) should be "Linux" and "aarch64" and that should detect the right platform to load. We will need to step into the Platform.getNativePlatform call and see why it is unable to determine the platform correctly.

CoreyKaylor commented 1 year ago

Could this be helpful?

https://simpligility.github.io/android-maven-plugin/native-deps.html

CoreyKaylor commented 1 year ago

Looks like that probably isn't a necessary dependency.

https://developer.android.com/studio/projects/gradle-external-native-builds