2017-06-29 81 views
0

我有一個加載.so文件並打印來自.so文件的結果的java文件。我的.so文件沒有源代碼。任何人都可以告訴如何在內存結構.so結果加載,並從這個Java類正在讀取.so生成的結果和打印出來?JNI如何在內存級別工作

回答

0

如果你有任何已經用本地語言編寫的代碼,並且不願意改變它,但是你想在你的java代碼中使用本機調用,而不是完全重寫所有的java。 JNI派上用場。它將所有平臺特定的實現轉換爲獨立於平臺。標準庫中性能和平臺敏感的API實現允許所有Java應用程序訪問此功能。以這種方式轉換庫文件.so。

JNIEnv包含從本機數據類型到java數據類型的所有類型的轉換。它也支持本地方法調用的合適實現,信號也由JVM處理。

作爲獨立於平臺的本地進程,特定於硬件和操作系統平臺的Java都通過將原生數據類型和方法調用映射到java而與平臺無關。 JNI執行上述使用庫文件的例子。所以還是.a文件

的對於JNI映射ü可以參考以下鏈接 http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html

+0

謝謝你的回答。它確實有幫助。是的,我有一個用Java編寫的代碼,用於加載libSSM.so,它可以計算CPU使用率值。此Java程序在Android應用程序上打印來自.so文件的CPU使用率值。當然,Java必須從內存中的某個地方讀取這些值,所以想知道內存結構中存儲的.so文件的存儲位置。 –

0

您的.so有一個JNI膠合類,它將所有Java本地方法(公共本機void x();)與編譯好的本機代碼綁定在一起。

0

我假設它使用JNI,否則我不知道它是如何工作的。如果它使用JNI,那麼它實際上使用JNI庫在.so中的Java堆上創建Java對象。尋找標記爲「native」的函數,這些函數直接映射到函數中,這樣當Java代碼在庫中運行某些東西時會被調用。

+0

謝謝您的回答。是的,它使用JNI,並使用System.LoadLibrary(.so)加載,但不知道函數映射。 Java程序使用libSSM.so來監視CPU使用情況並在android應用程序上打印結果。所以想知道MainActivity.java從哪裏讀取內存結構中編譯的C++代碼的值。 –

相關問題