JNI Symbol Conflicts in Mac OS


When I was adding Mac OS support to my open source project Javet, I found a weird behavior caused by JNI symbol conflicts which resulted in JVM 8 core-dump.

Javet is Java + V8 (JAVa + V + EighT). It is an awesome way of embedding Node.js and V8 in Java. It’s embedding behavior relies on 2 JNI libraries one for Node.js and one for V8. Both of them are loaded by dedicated classloader and share the same API and symbols, except that the Node.js one exposes more Node.js flavored symbols.

In Javet unit test, it loads both Node.js and V8 libraries and performs complicated test. The test goes well in Linux and Windows, but core-dumps in Mac OS.


The dump file shows the call stack crosses the library boundary.

...node...dylib <== Something wrong happens here.

It seems JVM in Mac OS registers global symbols in the same memory space, so that the V8 library calls into Node.js library. Obviously, that for sure leads to core-dump.

Failed Attempts

  • I tried various distributions of JDK 8. None of them worked. It seems to be the Mac OS’ behavior.
  • I tried to adjust the CMakeLists.txt. All my attempts failed.


I kept reviewing the call stack and realized the issue might be gone if these symbols were not global symbols.

So I created jni/exported_symbols_list.txt with the following content.


Then, I updated CMakeLists.txt with the following content.

target_link_libraries(Javet PUBLIC -exported_symbols_list ${CMAKE_SOURCE_DIR}/jni/exported_symbols_list.txt)

And, it works, no more core-dump with all test cases pass.




Amateur programmer

Love podcasts or audiobooks? Learn on the go with our new app.

My First 🥇iOS app: Photo 📸 Filters App (iOS app)

My experience in GDG CloudKasthiram 2020

Economic impact of process improvements in Agile development

My journey into Web3 education

Naming Conventions in Clean Coding Practices

4 Solutions to Microsoft Word Won’t Open on Mac

Better manage KiCAD projects using Git

The Rise of ‘Value Streams’

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Sam Cao

Sam Cao

Amateur programmer

More from Medium

Wiremock How to easily mock REST / SOAP or any other API

Full Stack Stress Test on Production

MongoDB Query Performance Tip

Five SOLID Principles