簡體   English   中英

使用JNI調用C ++庫函數,哪個進程執行該C ++庫

[英]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鏈接更多本機方法。

此后,本機庫確實與其他任何庫(例如libcurllibssl )一樣駐留在進程的內存空間中。 當您實際調用native方法之一時,JVM將找到函數地址並使用本機call指令跳入該函數。 該函數將作為該線程的堆棧跟蹤的一部分執行,並在JVM和本機堆棧跟蹤中都顯示出來。

在更高級的情況下,該庫可能會產生其他本地線程。 這些功能像本機代碼中的常規線程一樣工作,並且對JVM不可見。 如果這些線程也需要與JVM通信,則開發人員可以附加它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM