A robust native library loader for Android.

Overview

ReLinker
ReLinker

Build Status Maven Central Release

A robust native library loader for Android. More information can be found in our blog post

Min SDK: 9

JavaDoc

Overview

The Android PackageManager's native library loading is unreliable. Occasionally when using native libraries, you will encounter a stack trace like this:

java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:365)
at java.lang.System.loadLibrary(System.java:535)
at com.your.app.NativeClass.<clinit>(Native.java:16)
... 63 more

Caused by: java.lang.UnsatisfiedLinkError: Library stlport_shared not found
at java.lang.Runtime.loadLibrary(Runtime.java:461)
at java.lang.System.loadLibrary(System.java:557)
at com.your.app.NativeClass.<clinit>(Native.java:16)
... 5 more

ReLinker fixes these issues by replacing the standard System.loadLibrary call with a more reliable implementation.

Note that this library fixes intermittent link errors; if you get an error every time you use your app, you may have a configuration issue. See this StackOverflow question for more information.

Who needs ReLinker?

If your app includes native libraries, and your minimum SDK is below API 23 (Marshmallow), you need ReLinker.

There are a number of different bugs addressed by ReLinker; the last of these was resolved as of Marshmallow. As long as your app's min SDK is at or above it, loading libraries via System.loadLibrary("foo") is safe.

Installation

ReLinker is distributed using MavenCentral.

   repositories { 
        mavenCentral()
   }
   
   dependencies {
         compile 'com.getkeepsafe.relinker:relinker:x.x.x'
   }

If you wish, you may also use ReLinker with jitpack

Usage

Simply replace a call to System.loadLibrary like this:

System.loadLibrary("mylibrary");

With a call to ReLinker.loadLibrary like this:

ReLinker.loadLibrary(context, "mylibrary");

Advanced Usage

Asynchronous loading

ReLinker can load libraries asynchronously. Simply pass a LoadListener instance to the loadLibrary call:

ReLinker.loadLibrary(context, "mylibrary", new ReLinker.LoadListener() {
    @Override
    public void success() { /* Yay */ }

    @Override
    public void failure(Throwable t) { /* Boo */ }
});

Recursive loading

On older versions of Android, the system's library loader may fail to resolve intra-library dependencies. In this instance, ReLinker can resolve those dependencies for you. This will recursively load all libraries defined as "needed" by each library.

For example, if you have a library libchild that relies on libparent, then libchild will have an entry in its shared object file defining that. ReLinker will parse the shared object file and determine that libchild needs libparent. ReLinker will then proceed to load libparent (and any dependencies it may have) and then libchild.

To allow ReLinker to recursively load and resolve intra-library dependencies simply modify your loadLibrary call with the recursively modifier, like so:

ReLinker.recursively().loadLibrary(context, "mylibrary");

Logging

To help facilitate debugging, ReLinker can log messages to a Logger instance you provide:

ReLinker.log(myLogger).loadLibrary(context, "mylibrary");

Which will log the following messages during a normal / successful execution:

D/ReLinker: Beginning load of mylibrary...
D/ReLinker: mylibrary was not loaded normally, re-linking...
D/ReLinker: Looking for lib/x86/libmylibrary.so in APK...
D/ReLinker: Found lib/x86/libmylibrary.so! Extracting...
D/ReLinker: mylibrary was re-linked!

Versioning

In the event that your library's code is changed, it is a good idea to specify a specific version. Doing so will allow ReLinker to update the workaround library file successfully. In the case that the system handles the library loading appropriately, the version specified is not used as all library files are extracted and replaced on update or install.

To specify a version for your library simply provide it as an additional parameter for loadLibrary like:

ReLinker.loadLibrary(context, "mylibrary", "1.0");

This will cause ReLinker to look for, and load libmylibrary.so.1.0. Subsequent version updates will automatically clean up all other library versions.

Sample application

See the sample application under sample/ for a quick demo.

Acknowledgements

Special thanks to Jeff Young for the awesome logo!

License

Copyright 2015 - 2016 Keepsafe Software Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Exception java.lang.UnsatisfiedLinkError

    Exception java.lang.UnsatisfiedLinkError

    Hi,

    I'm using ReLinker 1.2.2 with cocos2d 3.15.1.

    Here is crash from real device: Model: Lenovo K50-t5 Android API: 23 Android OS: 6.0

    Exception java.lang.UnsatisfiedLinkError: dlopen failed: "/mnt/expand/96334dfa-6d50-4821-9b56-38dcc67f3a70/user/0/xxxxxxxxxxxxxx/app_lib/libcocos2djs.so" is 32-bit instead of 64-bit java.lang.Runtime.load (Runtime.java:332) java.lang.System.load (System.java:1069) com.getkeepsafe.relinker.SystemLibraryLoader.loadPath (SystemLibraryLoader.java:29) com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal (ReLinkerInstance.java:198) com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary (ReLinkerInstance.java:136) com.getkeepsafe.relinker.ReLinker.loadLibrary (ReLinker.java:70) com.getkeepsafe.relinker.ReLinker.loadLibrary (ReLinker.java:51) org.cocos2dx.lib.Cocos2dxActivity.onLoadNativeLibraries (Cocos2dxActivity.java:247) org.cocos2dx.lib.Cocos2dxActivity.onCreate (Cocos2dxActivity.java:265) org.cocos2dx.javascript.AppActivity.onCreate (AppActivity.java:60) android.app.Activity.performCreate (Activity.java:6583) android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1114) android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2531) android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2666) android.app.ActivityThread.-wrap11 (ActivityThread.java) android.app.ActivityThread$H.handleMessage (ActivityThread.java:1493) android.os.Handler.dispatchMessage (Handler.java:111) android.os.Looper.loop (Looper.java:207) android.app.ActivityThread.main (ActivityThread.java:5769) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:789) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:679)

    opened by Dimon4eg 20
  • Cannot load library if library failed to load previously

    Cannot load library if library failed to load previously

    After switching to ReLinker, I recently recently received this report from one my users. It seems like if a previous call to System.load() fails for a given library, then the library does not load in subsequent calls?

    java.lang.UnsatisfiedLinkError: Cannot load library: find_library(linker.cpp:901): "/data/data/com.LearnImmersive.Lingoland/app_lib/libLingolandNativeActivity.so" failed to load previously
        at java.lang.Runtime.load(Runtime.java:341)
        at java.lang.System.load(System.java:500)
        at com.getkeepsafe.relinker.SystemLibraryLoader.loadPath(SystemLibraryLoader.java:29)
        at com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal(ReLinkerInstance.java:198)
        at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(ReLinkerInstance.java:139)
        at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(ReLinkerInstance.java:95)
        at com.LearnImmersive.Lingoland.LingolandApplication.onCreate(LingolandApplication.java:71)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1003)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4661)
        at android.app.ActivityThread.access$1300(ActivityThread.java:162)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:194)
        at android.app.ActivityThread.main(ActivityThread.java:5400)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:837)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)
        at dalvik.system.NativeStart.main(Native Method)
    

    I am not sure how to diagnose this one further than this. I noticed some log statements inside your library that I will be sure to remotely propagate over rsyslog in a future release.

    If it helps, I also received the following information:

    Android version: Android 4.2
    Device: ONE TOUCH 4015X (Yaris35_GSM) 1
    Manufacturer: TCT Mobile Limited (Alcatel)
    Android version: Android 4.2
    RAM: (MB) 512
    Screen size: 320 × 480
    Screen density (dpi): 160
    OpenGL ES: version 2.0
    Native platform: armeabi-v7a
    CPU make: Mediatek
    CPU model: MT6572M
    

    Chances are I can obtain additional information from this user, but his technical knowledge is definitely average.

    help wanted question 
    opened by chuckhacker 15
  • Caused by: io.rong.imlib.relinker.MissingLibraryException: libdl.so

    Caused by: io.rong.imlib.relinker.MissingLibraryException: libdl.so

    E AndroidRuntime: java.lang.RuntimeException: Unable to bind to service io.rong.imlib.ipc.RongService@495a5e1 with Intent { cmp=com.xiniu.manmoli/io.rong.imlib.ipc.RongService (has extras) }: io.rong.imlib.relinker.MissingLibraryException: libdl.so 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at android.app.ActivityThread.handleBindService(ActivityThread.java:3304) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at android.app.ActivityThread.-wrap3(ActivityThread.java) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1638) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at android.os.Looper.loop(Looper.java:165) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6375) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: Caused by: io.rong.imlib.relinker.MissingLibraryException: libdl.so 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at sd.b.a(SourceFile:38) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at sd.f.d(SourceFile:15) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at sd.f.a(SourceFile:8) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at sd.f.a(SourceFile:4) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at sd.f.d(SourceFile:21) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at sd.f.a(SourceFile:8) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at sd.f.a(SourceFile:4) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at io.rong.imlib.NativeObject.(SourceFile:3) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at gd.Yd.a(SourceFile:19) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at gd.hc.(SourceFile:4) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at io.rong.imlib.ipc.RongService.onBind(SourceFile:4) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: at android.app.ActivityThread.handleBindService(ActivityThread.java:3290) 08-07 01:58:34.841 7763 7763 E AndroidRuntime: ... 8 more

    opened by Gitjiatao 13
  • JCenter to be shut down

    JCenter to be shut down

    Starting from May 1, 2021 JCenter will stop working. I was wondering if there are any plans to move to another repository, such as MavenCenter.

    Thanks!

    opened by tthiagomartinho 12
  • UnsatisfiedLinkError issue

    UnsatisfiedLinkError issue

    I use relinker lib, but it catch UnsatisfiedLinkError issue

    Model:K-Touch W619 Manufacturer:unknown Version:10 Release Version:2.3.6 ProductName:msm7627a CPU:armeabi-v7a java.lang.UnsatisfiedLinkError: Cannot load library: load_library[1104]: Library /data/data/com.xxxxxx/app_lib/libxxxx.so not found

    opened by onexuan 10
  • Fatal Exception: java.lang.UnsatisfiedLinkError

    Fatal Exception: java.lang.UnsatisfiedLinkError

    Hi guys,

    i want to report a problem that occures when my App (de.komoot.android) runs on a device with your keepsafe app.

    Fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library "/data/data/de.komoot.android/app_lib/librealm-jni.so" not found at java.lang.Runtime.load(Runtime.java:333) at java.lang.System.load(System.java:512) at com.getkeepsafe.relinker.SystemLibraryLoader.loadPath(SourceFile:29) at com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal(SourceFile:200) at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(SourceFile:140) at com.getkeepsafe.relinker.ReLinker.loadLibrary(SourceFile:70) at com.getkeepsafe.relinker.ReLinker.loadLibrary(SourceFile:51) at io.realm.internal.RealmCore.loadLibrary(SourceFile:89) at io.realm.RealmConfiguration$Builder.(SourceFile:352) at de.komoot.android.realm.KmtRealmHelper.getRealmConfiguration(SourceFile:135) at de.komoot.android.realm.KmtRealmMigration.initialMigrationCheck(SourceFile:71) at de.komoot.android.KomootApplication.onCreate(SourceFile:157) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4730) at android.app.ActivityThread.access$1600(ActivityThread.java:175) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5602) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(NativeStart.java)

    More Infos on crashlytics: http://crashes.to/s/d64ee5fe96f

    My App is using realm which cant load his native library so file. It would be cool if you together with the realm guys can solve this issue.

    Best regards Arne

    opened by ArneKoeckeritz 10
  • MissingLibraryException: lib/armeabi/libdl.so

    MissingLibraryException: lib/armeabi/libdl.so

    First of all,Thank you for share such a great project!! We had this problem for many yeas! I run the Sample project. After delete the so file it seems that after parseNeededDependencies it try to load libdl.so.

    04-29 16:32:21.888 22887-23167/com.getkeepsafe.relinker.sample E/AndroidRuntime: FATAL EXCEPTION: Thread-4944
                                                                                     Process: com.getkeepsafe.relinker.sample, PID: 22887
                                                                                     com.getkeepsafe.relinker.MissingLibraryException: lib/armeabi/libdl.so
                                                                                         at com.getkeepsafe.relinker.ApkLibraryInstaller.installLibrary(ApkLibraryInstaller.java:85)
                                                                                         at com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal(ReLinkerInstance.java:182)
                                                                                         at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(ReLinkerInstance.java:140)
                                                                                         at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(ReLinkerInstance.java:96)
                                                                                         at com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal(ReLinkerInstance.java:191)
                                                                                         at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(ReLinkerInstance.java:140)
                                                                                         at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(ReLinkerInstance.java:96)
                                                                                         at com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal(ReLinkerInstance.java:191)
                                                                                         at com.getkeepsafe.relinker.ReLinkerInstance.access$000(ReLinkerInstance.java:35)
                                                                                         at com.getkeepsafe.relinker.ReLinkerInstance$1.run(ReLinkerInstance.java:146)
                                                                                         at java.lang.Thread.run(Thread.java:818)```
    
    needs info 
    opened by BlueBirdZhangHua 9
  • Don't do operations on a closed `ZipFile`

    Don't do operations on a closed `ZipFile`

    When zip file was opened inside the loop and it did not contain the lib inside of it, the zipFile stayed non-null for all next iterations. This can cause next iterations that fail to open zip file to access previously already closed zipFile because zipFile == null will never be true.

    Fixed by moving the zipFile declaration inside of the loop.

    opened by blaztinn 7
  • .so loads but not able to call native func

    .so loads but not able to call native func

    Hey, Here's the stack trace of my log with Relinker. The .so file seems to load normally but fails to call any native method that's being implemented inside the .so file. Note : I am using your library listener with jnr-ffi for Android devices. Stacktrace from Relinker

    04-21 11:50:59.032 4455-4455/com.example.expertonetechnologies.jnrsample E/Native Directory: /data/app/com.example.expertonetechnologies.jnrsample-2/lib/arm
    04-21 11:50:59.032 4455-4455/com.example.expertonetechnologies.jnrsample E/Files: Size: 2
    04-21 11:50:59.033 4455-4455/com.example.expertonetechnologies.jnrsample E/CPU ARCH TYPE: armeabi
    04-21 11:50:59.037 4455-4455/com.example.expertonetechnologies.jnrsample E/Relink Logged: Beginning load of ffi_demo_old...
    04-21 11:50:59.039 4455-4503/com.example.expertonetechnologies.jnrsample E/Relink Logged: ffi_demo_old (null) was loaded normally!
    04-21 11:50:59.039 4455-4503/com.example.expertonetechnologies.jnrsample E/FFI DEMO: LIBRARY LOADED SUCCESSFULLY 
    
    

    Just curious on what does that null mean in ffi_demo_old (null) Here's my Android Java Code.

    ReLinker.log(new ReLinker.Logger() {
                    @Override
                    public void log(String message) {
                        Log.e("Relink Logged",message);
                    }
                }).loadLibrary(MainActivity.this, "ffi_demo_old", new ReLinker.LoadListener() {
                    @Override
                    public void success() {
                       //Calling jnr-ffi library to load the interface class thereby calling the native method
                        RustLib rustLib=LibraryLoader.create(RustLib.class).load("ffi_demo_old");
                        rustLib.double_input(10);
                        Log.e("FFI DEMO","LIBRARY LOADED SUCCESSFULLY");
                    }
    
                    @Override
                    public void failure(Throwable t) {
                        Log.e("FFI DEMO","LIBRARY LOADED FAILED");
                        t.printStackTrace();
                    }
                });
    

    This one now throws me an error and here's the stacktrace of the same for your reference. Gives me an ambiguous output in the logger.

    04-21 11:55:08.489 7360-7360/com.example.expertonetechnologies.jnrsample E/Native Directory: /data/app/com.example.expertonetechnologies.jnrsample-1/lib/arm
    04-21 11:55:08.489 7360-7360/com.example.expertonetechnologies.jnrsample E/Files: Size: 2
    04-21 11:55:08.489 7360-7360/com.example.expertonetechnologies.jnrsample E/CPU ARCH TYPE: armeabi
    04-21 11:55:08.493 7360-7360/com.example.expertonetechnologies.jnrsample E/Relink Logged: Beginning load of ffi_demo_old...
    04-21 11:55:08.494 7360-7391/com.example.expertonetechnologies.jnrsample E/Relink Logged: ffi_demo_old (null) was loaded normally!
    04-21 11:55:08.506 7360-7392/com.example.expertonetechnologies.jnrsample D/AppTracker: App Event: start
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample E/FFI DEMO: LIBRARY LOADED FAILED
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err: java.lang.UnsatisfiedLinkError: could not load FFI provider jnr.ffi.provider.jffi.Provider
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.InvalidProvider$1.loadLibrary(InvalidProvider.java:30)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.LibraryLoader.load(LibraryLoader.java:269)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.LibraryLoader.load(LibraryLoader.java:248)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.example.expertonetechnologies.jnrsample.MainActivity$1.success(MainActivity.java:50)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.getkeepsafe.relinker.ReLinkerInstance$1.run(ReLinkerInstance.java:143)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at java.lang.Thread.run(Thread.java:761)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err: Caused by: java.lang.ExceptionInInitializerError
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.jffi.Provider.<init>(Provider.java:29)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at java.lang.Class.newInstance(Native Method)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.<clinit>(FFIProvider.java:57)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.access$000(FFIProvider.java:56)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.LibraryLoader.create(LibraryLoader.java:52)
    04-21 11:55:08.521 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err: 	... 3 more
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err: Caused by: java.lang.IllegalStateException: Can't overwrite cause with java.lang.UnsatisfiedLinkError
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:252)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Type.resolveSize(Type.java:155)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Type.size(Type.java:138)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.AbstractRuntime.<init>(AbstractRuntime.java:48)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:57)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:41)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.<clinit>(NativeRuntime.java:53)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err: 	... 11 more
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err: Caused by: java.lang.UnsatisfiedLinkError
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Foreign.newLoadError(Foreign.java:72)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Foreign.access$300(Foreign.java:42)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Foreign$InValidInstanceHolder.getForeign(Foreign.java:98)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Foreign.getInstance(Foreign.java:103)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err: 	... 19 more
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err: Caused by: java.lang.UnsatisfiedLinkError
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Init.newLoadError(Init.java:132)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Init.load(Init.java:89)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Foreign$InstanceHolder.<clinit>(Foreign.java:45)
    04-21 11:55:08.522 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err: 	... 21 more
    04-21 11:55:08.523 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err: Caused by: java.lang.RuntimeException: cannot determine CPU
    04-21 11:55:08.523 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.internal.StubLoader.determineCPU(StubLoader.java:189)
    04-21 11:55:08.523 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.internal.StubLoader.getCPU(StubLoader.java:193)
    04-21 11:55:08.523 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.internal.StubLoader.getPlatformName(StubLoader.java:221)
    04-21 11:55:08.523 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.internal.StubLoader.loadFromBootPath(StubLoader.java:306)
    04-21 11:55:08.523 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:246)
    04-21 11:55:08.523 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.internal.StubLoader.<clinit>(StubLoader.java:431)
    04-21 11:55:08.523 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at java.lang.Class.classForName(Native Method)
    04-21 11:55:08.523 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at java.lang.Class.forName(Class.java:400)
    04-21 11:55:08.523 7360-7391/com.example.expertonetechnologies.jnrsample W/System.err:     at com.kenai.jffi.Init.load(Init.java:68)
    

    Sorry for such a long post . Thanks for your patience in taking time to read this one 😄 Awaiting your response over this issue.

    question 
    opened by kkrishnan90 7
  • Better error message if supported ABI's cannot be found inside the APK.

    Better error message if supported ABI's cannot be found inside the APK.

    This PR adds a better error message if an ABI cannot be successfully located.

    This is helpful as some app users are side-loading APKs outside the Play Store. If those apps have been built using App Bundle or APK Split, it could result in users loading an APK that doesn't support their device, which results in a rather unhelpful error message like com.getkeepsafe.relinker.MissingLibraryException: libtest.so. This isn't particularly helpful for an app developer tracking their crashes. Especially if they are using a 3rd party library that includes native code. In that case, it could look like it is a bug in the 3rd party library.

    With this PR, the error message now tries to be more descriptive about what has been tried and what is actually supported by the device, so the error message will now look like this:

    Could not find 'libtest.so'. Looking for: [armeabi-v7a], but only [x86, arm64-v8a] are supported.

    opened by cmelchior 6
  • How to build relinker for ant?

    How to build relinker for ant?

    I'm not using Gradle yet for our android project (for various reasons outside of my control). I'd like to use relinker with my android project.

    What I figured I'd do is use gradle to build a jar file and just put that in my libs directory so it gets pulled in and I can use it.

    I'm not having any luck building relinker though. I modified relinker/build.gradle to set these differently:

        compileSdkVersion 15
        buildToolsVersion "26"
    

    After that it fails:

    $ gradle
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    A problem occurred configuring project ':relinker'.
    > Failed to notify project evaluation listener.
       > com.android.build.gradle.tasks.factory.AndroidJavaCompile.setDependencyCacheDir(Ljava/io/File;)V
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
    
    BUILD FAILED in 0s
    

    I am using a version of gradle I downloaded directly from the gradle website. I do not use Android Studio at the moment. Not sure what the issue is, hopefully you can help.

    Thanks in advance.

    opened by rcdailey 5
  • 1.4.4 - Extremely Rare Android 12: Exception java.lang.NullPointerException

    1.4.4 - Extremely Rare Android 12: Exception java.lang.NullPointerException

    Exception java.lang.NullPointerException

    Screen Shot 2022-08-31 at 12 37 11 am

    Code stack:

    Exception java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDir(java.lang.String, int)' on a null object reference
      at android.content.ContextWrapper.getDir (ContextWrapper.java:335)
      at com.getkeepsafe.relinker.ReLinkerInstance.getWorkaroundLibDir (ReLinkerInstance.java:215)
      at com.getkeepsafe.relinker.ReLinkerInstance.getWorkaroundLibFile (ReLinkerInstance.java:230)
      at com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal (ReLinkerInstance.java:173)
      at com.getkeepsafe.relinker.ReLinkerInstance.access$000 (ReLinkerInstance.java:31)
      at com.getkeepsafe.relinker.ReLinkerInstance$1.run (ReLinkerInstance.java:142)
      at java.lang.Thread.run (Thread.java:920)
      
    

    Calling code:

    ReLinker.loadLibrary(this, "openFrameworksAndroid", new ReLinker.LoadListener() {
    				@Override
    				public void success() {
    					OFAndroidLifeCycle.coreLibraryLoaded = true;
    					Setup();
    				}
    				@Override
    				public void failure(Throwable t) {
    					Log.e(TAG, "Failure to Load Core Static Library: " + t.getMessage());
    				}
    			});
    
    opened by danoli3 0
  • Xamarin Android, CompilationFailedException: ApkLibraryInstaller$ZipFileInZipEntry.class

    Xamarin Android, CompilationFailedException: ApkLibraryInstaller$ZipFileInZipEntry.class

    I have developing Xamarin project for Android and building is failed with

    java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj\Debug\110\lp\134\jl\bin\classes.jar : com/getkeepsafe/relinker/ApkLibraryInstaller$ZipFileInZipEntry.class MyClient.Android

    Exception in thread "main" java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj\Debug\110\lp\134\jl\bin\classes.jar:com/getkeepsafe/relinker/ApkLibraryInstaller$ZipFileInZipEntry.class I have no idea why this is causing. This caused after install Twilio.Conversations.Xamarin nuget library.

    Do you have any idea?

    opened by NishiokaTakeo 0
  • Unable to find the library even though it is existing in the Apk of the devices which is causing the issue

    Unable to find the library even though it is existing in the Apk of the devices which is causing the issue

    Caused by com.getkeepsafe.relinker.b: Could not find 'libjni_latinime.so'. Looked for: [armeabi-v7a, armeabi], but only found: []. at com.getkeepsafe.relinker.ApkLibraryInstaller.installLibrary(ApkLibraryInstaller.java:175) at com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal(ReLinkerInstance.java:180) at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(ReLinkerInstance.java:136) at com.getkeepsafe.relinker.ReLinker.loadLibrary(ReLinker.java:70) at com.getkeepsafe.relinker.ReLinker.loadLibrary(ReLinker.java:51) at com.android.inputmethod.latin.utils.JniUtils.<clinit>(JniUtils.java:30) at com.android.inputmethod.latin.utils.JniUtils.loadNativeLibrary(JniUtils.java) at com.android.inputmethod.latin.BinaryDictionary.<clinit>(BinaryDictionary.java:228) at com.android.inputmethod.indic.ExpandableBinaryDictionary.openBinaryDictionaryLocked(ExpandableBinaryDictionary.java:272) at com.android.inputmethod.indic.ExpandableBinaryDictionary.loadBinaryDictionaryLocked(ExpandableBinaryDictionary.java:626) at com.android.inputmethod.indic.ExpandableBinaryDictionary.access$700(ExpandableBinaryDictionary.java:56) at com.android.inputmethod.indic.ExpandableBinaryDictionary$12.run(ExpandableBinaryDictionary.java:689) at com.android.inputmethod.indic.ExpandableBinaryDictionary$1.run(ExpandableBinaryDictionary.java:212) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818)

    Screenshot 2022-05-06 at 11 11 09 AM

    As you can see in the image in the file it is existing in the Apk, this is one of the prominent devices apk in which crashes are coming. Any specific reason why is coming?

    opened by Zaraki596 4
  • android平台Google渠道aab包无法加载mmkv的so,报com.getkeepsafe.relinker.MissingLibraryException

    android平台Google渠道aab包无法加载mmkv的so,报com.getkeepsafe.relinker.MissingLibraryException

    1、报错堆栈 java.lang.ExceptionInInitializerError: at com.xxx.aspectj.SpAspect$Holder.access$000 (SpAspect.java) at com.xxx.aspectj.SpAspect.redirectEnable (SpAspect.java:90) at com.xxx.aspectj.SpAspect.onContextGetSp (SpAspect.java:39) at com.huawei.hms.aaid.utils.PushPreferences$CallStubCgetSharedPreferencesa47401526db6800508c1c59bfb8a057b.redirect (PushPreferences.java) at com.xxx.library.mtajx.runtime.BaseMethodJoint.invoke (BaseMethodJoint.java:13) at com.huawei.hms.aaid.utils.PushPreferences. (PushPreferences.java:4) at com.huawei.hms.opendevice.i. (i.java:1) at com.huawei.hms.opendevice.i.a (i.java:1) at com.huawei.hms.aaid.init.AutoInitHelper.isAutoInitEnabled (AutoInitHelper.java:1) at com.huawei.hms.aaid.init.AutoInitHelper.doAutoInit (AutoInitHelper.java:1) at com.huawei.hms.aaid.InitProvider.onCreate (InitProvider.java:1) at android.content.ContentProvider.attachInfo (ContentProvider.java:2476) at android.content.ContentProvider.attachInfo (ContentProvider.java:2446) at android.app.ActivityThread.installProvider (ActivityThread.java:7904) at android.app.ActivityThread.installContentProviders (ActivityThread.java:7394) at android.app.ActivityThread.handleBindApplication (ActivityThread.java:7148) at android.app.ActivityThread.access$1800 (ActivityThread.java:284) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2266) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loopOnce (Looper.java:233) at android.os.Looper.loop (Looper.java:334) at android.app.ActivityThread.main (ActivityThread.java:8333) at java.lang.reflect.Method.invoke (Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:582) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1065) at com.android.internal.crash.avbgmp7fqnit63ydh57mxmxuaf (crash.java:1) Caused by: com.getkeepsafe.relinker.MissingLibraryException: at com.getkeepsafe.relinker.ApkLibraryInstaller.installLibrary (ApkLibraryInstaller.java:128) at com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal (ReLinkerInstance.java:180) at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary (ReLinkerInstance.java:136) at com.getkeepsafe.relinker.ReLinker.loadLibrary (ReLinker.java:70) at com.getkeepsafe.relinker.ReLinker.loadLibrary (ReLinker.java:51) at com.xxx.core.sharedpreferences.SPUtil$rootDir$2$root$1.loadLibrary (SPUtil.java:58) at com.tencent.mmkv.MMKV.doInitialize (MMKV.java:116) at com.tencent.mmkv.MMKV.initialize (MMKV.java:108) at com.tencent.mmkv.MMKV.initialize (MMKV.java:97) at com.xxx.core.sharedpreferences.SPUtil$rootDir$2.invoke (SPUtil.java:57) at com.xxx.core.sharedpreferences.SPUtil$rootDir$2.invoke (SPUtil.java:29) at kotlin.SynchronizedLazyImpl.getValue (SynchronizedLazyImpl.java:74) at com.xxx.core.sharedpreferences.SPUtil.getRootDir (SPUtil.java:8) at com.xxx.core.sharedpreferences.SPUtil.getSharedPreferences (SPUtil.java:173) at com.xxx.core.sharedpreferences.SPUtil.getSharedPreferences$default (SPUtil.java:171) at com.xxx.core.sharedpreferences.SPUtil.readValue$default (SPUtil.java:277) at com.xxx.core.sharedpreferences.SPUtil.readValue (SPUtil.java:13) at com.xxx.pushagent.helper.OnOffSwitchHelper.readLastSwitchIfNeed (OnOffSwitchHelper.java:132) at com.xxx.pushagent.helper.OnOffSwitchHelper.getOnOffSwitch (OnOffSwitchHelper.java:953) at com.xxx.pushagent.helper.OnOffSwitchHelper.isSpReplaceEnable (OnOffSwitchHelper.java:911) at com.xxx.aspectj.SpAspect$Holder. (SpAspect.java:94) at com.xxx.aspectj.SpAspect$Holder.access$000 (SpAspect.java) at com.xxx.aspectj.SpAspect.redirectEnable (SpAspect.java:90) at com.xxx.aspectj.SpAspect.onContextGetSp (SpAspect.java:39) at com.huawei.hms.aaid.utils.PushPreferences$CallStubCgetSharedPreferencesa47401526db6800508c1c59bfb8a057b.redirect (PushPreferences.java) at com.xxx.library.mtajx.runtime.BaseMethodJoint.invoke (BaseMethodJoint.java:13) at com.huawei.hms.aaid.utils.PushPreferences. (PushPreferences.java:4) at com.huawei.hms.opendevice.i. (i.java:1) at com.huawei.hms.opendevice.i.a (i.java:1) at com.huawei.hms.aaid.init.AutoInitHelper.isAutoInitEnabled (AutoInitHelper.java:1) at com.huawei.hms.aaid.init.AutoInitHelper.doAutoInit (AutoInitHelper.java:1) at com.huawei.hms.aaid.InitProvider.onCreate (InitProvider.java:1) at android.content.ContentProvider.attachInfo (ContentProvider.java:2476) at android.content.ContentProvider.attachInfo (ContentProvider.java:2446) at android.app.ActivityThread.installProvider (ActivityThread.java:7904) at android.app.ActivityThread.installContentProviders (ActivityThread.java:7394) at android.app.ActivityThread.handleBindApplication (ActivityThread.java:7148) at android.app.ActivityThread.access$1800 (ActivityThread.java:284) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2266) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loopOnce (Looper.java:233) at android.os.Looper.loop (Looper.java:334) at android.app.ActivityThread.main (ActivityThread.java:8333) at java.lang.reflect.Method.invoke (Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:582) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1065) at com.android.internal.crash.avbgmp7fqnit63ydh57mxmxuaf (crash.java:1)

    2、mmkv版本:com.tencent:mmkv-static:1.2.8 3、relinker版本:com.getkeepsafe.relinker:relinker:1.3.1

    4、cpu架构: "armeabi-v7a", "arm64-v8a"

    集中发生在11、12以及8系统,vivo手机居多,请问遇到这种问题如何解决呢?

    opened by jimmy5zhang 3
  • Purpose?

    Purpose?

    I have a very rudimentary understanding of systems and theoretically what they are capable of. I have recently learned a bit about open source and am ignorant to do much and could really use some guidance as far which direction to point with my research. That being said, What is the purpose of the relinker? Is this an upgrade to an already running system? An app in itself? Or maybe is it code for something all together entirely. If someone could be so kind as to brief me, I'd be grateful.

    opened by RockLyte777 1
Releases(1.4.4)
  • 1.4.4(Jul 9, 2021)

  • 1.4.3(Mar 3, 2021)

  • 1.4.2(Mar 3, 2021)

  • 1.4.1(Feb 24, 2020)

    Changes

    • Don't do operations on a closed ZipFile (#68)
    • Document the 'max SDK' at which ReLinker is useful (#72)

    Thank you

    • @benjamin-bader
    • @blaztinn
    Source code(tar.gz)
    Source code(zip)
  • 1.4.0(Jan 6, 2020)

  • 1.3.1(Jan 3, 2019)

  • 1.3.0(Sep 12, 2018)

  • 1.2.3(Oct 26, 2017)

  • 1.2.2(Feb 15, 2017)

    fa09971 Library: Catch MissingLibraryException Fixes #27 079eef0 Library: Use CPU_ABI2 if present 5381afb Make library source compatible with Java 1.6 (#24) bf47ce8 Remove dependency on android.text.TextUtils (#23)

    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Mar 25, 2016)

  • 1.2(Mar 20, 2016)

    ReLinker 1.2 introduces quite a few features and is 100% backwards compatible with previous versions

    • Added asynchronous loading #5
    • Added recursive loading #8
    • Added a logging interface #7
    • Added the ability to version your libraries #6
    • Added unit tests #9

    Changes from RC

    • log() now logs the exception thrown when the system's linker fails to work properly #16
    Source code(tar.gz)
    Source code(zip)
  • 1.2RC(Mar 13, 2016)

    ReLinker 1.2 introduces quite a few features and is 100% backwards compatible with previous versions

    • Added asynchronous loading
    • Added recursive loading
    • Added a logging interface
    • Added the ability to version your libraries
    • Added unit tests
    Source code(tar.gz)
    Source code(zip)
Owner
Keepsafe
Empowering the average person’s digital privacy we’re innovating on existing privacy, crypto and security technology. Over 50 million users.
Keepsafe
Command framework built around Kord, built to be robust and scalable, following Kord's convention and design patterns.

Command framework built around Kord, built to be robust and scalable, following Kord's convention and design patterns.

ZeroTwo Bot 4 Jun 15, 2022
Native solution for common React Native problem of focused views being covered by soft input view.

react-native-avoid-softinput Native solution for common React Native problem of focused views being covered by soft input view. It is solved by listen

Mateusz Mędrek 312 Jan 2, 2023
Android Utilities Library build in kotlin Provide user 100 of pre defined method to create advanced native android app.

Android Utilities Library build in kotlin Provide user 100 of pre defined method to create advanced native android app.

Shahid Iqbal 4 Nov 29, 2022
Multiplaform kotlin library for calculating text differences. Based on java-diff-utils, supports JVM, JS and native targets.

kotlin-multiplatform-diff This is a port of java-diff-utils to kotlin with multiplatform support. All credit for the implementation goes to original a

Peter Trifanov 51 Jan 3, 2023
Native Kotlin library for time-based TOTP and HMAC-based HOTP one-time passwords

A kotlin implementation of HOTP (RFC-4226) and TOTP (RFC-6238). Supports validation and generation of 2-factor authentication codes, recovery codes and randomly secure secrets.

Robin Ohs 6 Dec 19, 2022
Routable, an in-app native URL router, for Android

Routable Routable is an in-app native URL router, for Android. Also available for iOS. Usage Set up your app's router and URLs: import com.usepropelle

Clay Allsopp 476 Nov 11, 2022
React Native wrapper to bridge our iOS and Android SDK

React Native wrapper to bridge our iOS and Android SDK

Intercom 94 Jan 1, 2023
Fuzzy string matching for Kotlin (JVM, native, JS, Web Assembly) - port of Fuzzy Wuzzy Python lib

FuzzyWuzzy-Kotlin Fuzzy string matching for Kotlin (JVM, iOS) - fork of the Java fork of of Fuzzy Wuzzy Python lib. For use in on JVM, Android, or Kot

WillowTree, LLC 54 Nov 8, 2022
Gitversion - A native console application to calculate a version based on git commits and tags

GitCommit A native console application to calculate a version based on git commi

Solugo 5 Sep 13, 2022
A Kotlin native Postgres driver for SqlDelight.

Module postgres-native-sqldelight A native Postgres driver for SqlDelight. Source code Install This package is uploaded to MavenCentral and supports m

Philip Wedemann 19 Dec 30, 2022
Android library which makes it easy to handle the different obstacles while calling an API (Web Service) in Android App.

API Calling Flow API Calling Flow is a Android library which can help you to simplify handling different conditions while calling an API (Web Service)

Rohit Surwase 19 Nov 9, 2021
Joda-Time library with Android specialization

joda-time-android This library is a version of Joda-Time built with Android in mind. Why Joda-Time? Android has built-in date and time handling - why

Daniel Lew 2.6k Dec 9, 2022
UPnP/DLNA library for Java and Android

Cling EOL: This project is no longer actively maintained, code may be outdated. If you are interested in maintaining and developing this project, comm

4th Line 1.6k Jan 4, 2023
:iphone: [Android Library] Get device information in a super easy way.

EasyDeviceInfo Android library to get device information in a super easy way. The library is built for simplicity and approachability. It not only eli

Nishant Srivastava 1.7k Dec 22, 2022
Android library for viewing, editing and sharing in app databases.

DbInspector DbInspector provides a simple way to view the contents of the in-app database for debugging purposes. There is no need to pull the databas

Infinum 924 Jan 4, 2023
Android Market In-app Billing Library

Update In-app Billing v2 API is deprecated and will be shut down in January 2015. This library was developed for v2 a long time ago. If your app is st

Robot Media 533 Nov 25, 2022
An Android library allowing images to exhibit a parallax effect that reacts to the device's tilt

Motion An Android library allowing images to exhibit a parallax effect. By replacing static pictures and backgrounds with a fluid images that reacts t

Nathan VanBenschoten 781 Nov 11, 2022
Android library to easily serialize and cache your objects to disk using key/value pairs.

Deprecated This project is no longer maintained. No new issues or pull requests will be accepted. You can still use the source or fork the project to

Anup Cowkur 667 Dec 22, 2022
Form Validator Library for Android

Android-Validator Form Validator Library for Android [](https://flattr.com/submit/auto?user_id=throrin19&url=https://github.com/throrin19/Android-Vali

Benjamin Besse 449 Dec 17, 2022