[英]Calling C++ library function using JNI and which process executes that C++ library
我是Java和JNI的新手。 這個問題也許很新。 我有C ++庫和Java應用程序,實習生使用JNI概念調用C ++函數。
據我了解,JVM在調用本機函數調用之前將C ++ dll / SO加載到JVM空間中。
如果我對JVM的理解在JNI上是正確的。 有人可以告訴我哪個/誰將執行JVM內部加載的C ++庫函數。
假設對於C ++,存在標准的動態鏈接程序加載器,用於處理C ++的動態執行部分並執行所有機器指令。
如果JVM加載了JNI庫(在本例中為C ++庫),那么JVM是否執行那些庫? 如果是這樣,它是否使用其內存執行本機功能?
提前致謝。
Java語言允許您將某些方法標記為native
。 Java本機接口允許您將這些Java方法鏈接到本機代碼中的函數地址。 當您在System.loadLibrary
一個包含本機代碼的庫時,JVM將執行以下兩項操作:
Java_pkg_Cls_f_ILjava_lang_String_2
並將其鏈接到類pkg.Cls
的函數f
。 JNI_OnLoad
,如果它存在於庫中。 這可以執行初始化,並可以選擇使用registerNatives
鏈接更多本機方法。 此后,本機庫確實與其他任何庫(例如libcurl
或libssl
)一樣駐留在進程的內存空間中。 當您實際調用本native
方法之一時,JVM將找到函數地址並使用本機call
指令跳入該函數。 該函數將作為該線程的堆棧跟蹤的一部分執行,並在JVM和本機堆棧跟蹤中都顯示出來。
在更高級的情況下,該庫可能會產生其他本地線程。 這些功能像本機代碼中的常規線程一樣工作,並且對JVM不可見。 如果這些線程也需要與JVM通信,則開發人員可以附加它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.