Hello Michael,

Am 27.03.20 um 15:46 schrieb Michael Wojcik:
As a workaround, what about first making a JNI call to a trivial shared object that does an explicit dlopen of the OpenSSL shared object? The JVM wouldn't know about that load, and its subsequent unload of the shared object wouldn't remove it from the process address space, because there would still be a reference to it.

thanks for the suggestion. This sounds similar to the trick that is already built into OpenSSL.

Through other channels I found now two other possible solutions for the problem:

1) Use JNI_OnUnload() to call OPENSSL_cleanup()

JNI_OnUnload() is called when the JVM unloads the JNI library. OPENSSL_cleanup() cleans up everything and no further per-thread cleanup happens after unloading the JNI shared library.

2) Use a C++ static object in the JNI library where the destructor calls OPENSSL_cleanup()

When debugging the problem I came across this neat trick on stackoverflow:

https://stackoverflow.com/a/11394263

class ResourceHolder {
public:
    ResourceHolder() {
        // at start
    }

    ~ResourceHolder() {
        // at exit
    }
};

ResourceHolder theHolder;

I think that putting a call to OPENSSL_cleanup() into the destructor of the ResourceHolder class would also fix the problem, and it would be Java-agnostic.

Approach 1) does fix the crash for me. If approach 2) works as well, I will use that one.

--
Stephan

Reply via email to