<div dir="ltr"><div>The createRtcContext function is like this:</div><div><div style="background-color:rgb(30,31,34);color:rgb(188,190,196)"><pre style="font-family:"JetBrains Mono",monospace;font-size:9.8pt"><span style="color:rgb(207,142,109)">void </span><span style="color:rgb(86,168,245)">createRtcContext</span>(<span style="color:rgb(207,142,109)">const char</span>* localId, <span style="color:rgb(207,142,109)">int </span>logLevel, <span style="color:rgb(181,182,227)">IceConfig</span>* iceConfig, <span style="color:rgb(181,182,227)">DataChannelConfig</span>* dataChannelConfig) {<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"1" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    <span style="color:rgb(207,142,109)">int </span>expected = <span style="color:rgb(42,172,184)">0</span>;<br>    <span style="color:rgb(207,142,109)">bool </span>success = state.compare_exchange_strong(expected, <span style="color:rgb(42,172,184)">1</span>);<br>    <span style="color:rgb(207,142,109)">if </span>(!success) <span style="color:rgb(207,142,109)">return</span>;<br>    <span style="color:rgb(207,142,109)">if </span>(localId == <span style="color:rgb(207,142,109)">nullptr</span>) <span style="color:rgb(207,142,109)">return</span>;<br>    <span style="color:rgb(207,142,109)">if </span>(iceConfig == <span style="color:rgb(207,142,109)">nullptr</span>) <span style="color:rgb(207,142,109)">return</span>;<br>    <span style="color:rgb(207,142,109)">if </span>(dataChannelConfig == <span style="color:rgb(207,142,109)">nullptr</span>) <span style="color:rgb(207,142,109)">return</span>;<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"2" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    <span style="color:rgb(181,182,227)">std</span>::<span style="color:rgb(185,188,209)">string </span>id = <span style="color:rgb(181,182,227)">std</span>::string(localId);<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"2 1" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">" " </span><span style="color:rgb(95,140,138)"><< </span>id <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    <span style="color:rgb(181,182,227)">std</span>::make_unique<<span style="color:rgb(207,142,109)">int</span>>(<span style="color:rgb(42,172,184)">3</span>);<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"2 1 1" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    rtcManager <span style="color:rgb(95,140,138)">= </span><span style="color:rgb(181,182,227)">std</span>::make_unique<<span style="color:rgb(181,182,227)">RtcManager</span>>(); <span style="color:rgb(122,126,133)">// Crash here!<br></span><span style="color:rgb(122,126,133)">    </span><span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"2 1 2" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    rtcManager<span style="color:rgb(95,140,138)">-></span>setLocalId(id);<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"2 2" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    rtcManager<span style="color:rgb(95,140,138)">-></span>initLogger(logLevel);<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"2 3" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    <span style="color:rgb(181,182,227)">IceModel </span>iceModel;<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"2 4" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    iceModel.setNoStun(iceConfig-><span style="color:rgb(147,115,165)">noStun</span>);<br>    iceModel.setStunServer(<span style="color:rgb(181,182,227)">std</span>::string(iceConfig-><span style="color:rgb(147,115,165)">stunServer</span>));<br>    iceModel.setStunPort(iceConfig-><span style="color:rgb(147,115,165)">stunPort</span>);<br>    iceModel.setUdpMux(iceConfig-><span style="color:rgb(147,115,165)">udpMux</span>);<br>    iceModel.setWebSocketServer(<span style="color:rgb(181,182,227)">std</span>::string(iceConfig-><span style="color:rgb(147,115,165)">webSocketServer</span>));<br>    iceModel.setWebSocketPort(iceConfig-><span style="color:rgb(147,115,165)">webSocketPort</span>);<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"2 5" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    <span style="color:rgb(207,142,109)">auto </span>dataChannelListener = <span style="color:rgb(181,182,227)">DataChannelListener</span>::Builder()<br>            .withOnOpen(dataChannelConfig-><span style="color:rgb(147,115,165)">onOpen</span>)<br>            .withOnClosed(dataChannelConfig-><span style="color:rgb(147,115,165)">onClosed</span>)<br>            .withOnTextMessage(dataChannelConfig-><span style="color:rgb(147,115,165)">onTextMessage</span>)<br>            .withOnBinaryMessage(dataChannelConfig-><span style="color:rgb(147,115,165)">onBinaryMessage</span>)<br>            .build();<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"2 6" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    <span style="color:rgb(181,182,227)">std</span>::<span style="color:rgb(181,182,227)">shared_ptr</span><<span style="color:rgb(181,182,227)">DataChannelListener</span>> dcListener = <span style="color:rgb(181,182,227)">std</span>::move(dataChannelListener);<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"3" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    rtcManager<span style="color:rgb(95,140,138)">-></span>initDataChannelListener(dcListener);<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"4" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    <span style="color:rgb(181,182,227)">std</span>::<span style="color:rgb(181,182,227)">unique_ptr</span><<span style="color:rgb(181,182,227)">WebSocketHelper</span>> webSocketHelper = rtcManager<span style="color:rgb(95,140,138)">-></span>connectToSignalingServer(iceModel);<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"5" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>    <span style="color:rgb(207,142,109)">while </span>(state.load() == <span style="color:rgb(42,172,184)">1</span>) {<br>        <span style="color:rgb(181,182,227)">std</span>::<span style="color:rgb(181,182,227)">this_thread</span>::yield();<br>    }<br>    <span style="color:rgb(181,182,227)">std</span>::cout <span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(106,171,115)">"6" </span><span style="color:rgb(95,140,138)"><< </span><span style="color:rgb(181,182,227)">std</span>::endl;<br>}</pre></div></div></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Mon, Mar 31, 2025 at 5:26 PM bai li <<a href="mailto:k3315368931@gmail.com">k3315368931@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi Panama team,<br><br>I’m using the Java FFM API in JDK 21 to call a C++ dynamic library function, `void createRtcContext(const char* localId, int logLevel, IceConfig* iceConfig, DataChannelConfig* dataChannelConfig)`. The function can be invoked, but it crashes when executing `std::make_unique<RtcManager>()` inside the function. The same C++ code runs without any issues when executed independently. The `RtcManager` class is roughly defined as follows:<br><br>```cpp<br>class RtcManager {<br>private:<br>    std::string localId;<br>    rtc::Configuration config;<br>    std::unordered_map<std::string, std::shared_ptr<rtc::PeerConnection>> peerConnectionMap;<br>    std::unordered_map<std::string, std::shared_ptr<rtc::DataChannel>> dataChannelMap;<br>    std::shared_ptr<rtc::WebSocket> ws = std::make_shared<rtc::WebSocket>();<br>    std::shared_ptr<DataChannelListener> dataChannelListener = nullptr;<br>public:<br>    explicit RtcManager(const std::string& id) : localId(id) {}<br>};<div><div>The C++ code is compiled with MSVC 2022. Here’s the crash log from the console:</div></div><div># A fatal error has been detected by the Java Runtime Environment:<br>#<br>#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb0ca62f58, pid=22096, tid=26348<br>#<br># JRE version: Java(TM) SE Runtime Environment (21.0.6+8) (build 21.0.6+8-LTS-188)<br># Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0.6+8-LTS-188, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)<br># Problematic frame:<br># C  [msvcp140.dll+0x12f58]<br>#<br># No core dump will be written. Minidumps are not enabled by default on client versions of Windows<br>#<br># An error report file with more information is saved as:<br># E:\projects\backend-projects\test\hs_err_pid22096.log<br>[0.236s][warning][os] Loading hsdis library failed<br>#<br># If you would like to submit a bug report, please visit:<br>#   <a href="https://bugreport.java.com/bugreport/crash.jsp" target="_blank">https://bugreport.java.com/bugreport/crash.jsp</a><br># The crash happened outside the Java Virtual Machine in native code.<br># See problematic frame for where to report the bug.<br>#<br></div><div><div>Thanks</div></div></div>
</blockquote></div>