請看第一個步驟,當執行到stringFromJNI()時,JVM一看,原來是一個native方法,這時,它就會去對應的位置找對應的c++函數。
那麼這時,問題就來了,這裏的對應位置具體是在哪裏呢?
這裏的位置實際上就是C++的動態庫裏,這個動態庫等同於java中的jar包,jar包裏有編譯好的class文件。動態庫裏同樣有提前編譯好的c++文件。明白了,是在動態庫裏找之後,那麼這個動態庫長什麼樣子呢?請看下面
以.so結尾的文件,就是動態庫,動態庫就類似於java中的jar包。
libnative-lib這是動態庫的名字,就像jar包的名字一樣
可以發現這裏有兩個動態庫,爲什麼會有兩個呢?
這是因爲不同的CPU,內置的機器指令不一樣。arm64-v8a 和armeabi-v7a,這是兩個不同類型的cpu,它們內置的機器指令或多或少有些區別,因此,我們的編譯器在編譯C++代碼時,在arm64-v8a平臺上,就要將源代碼翻譯成針對於這個平臺上的機器指令。在armeabi-v7a平臺上,就要將源代碼翻譯成針對於這個平臺的機器指令。這也是爲什麼你會看到有2個動態庫的原因。到時程序運行時,在哪個平臺上,就加載哪個平臺對應的動態庫就行。
java是如何加載動態庫的
staitc{}在類加載的時候,就會運行。因此在裏面加載動態庫非常合適。
java如何找到對應的C++函數的
現在我們已經明白了一點,C或者C++編譯後的代碼是在動態庫裏,JVM已經能夠找到動態庫了。但這裏有一個問題,動態庫裏會有很多的函數,那麼java應該如何去找到stringFromJNI()所對應的函數的呢?
我們直接來看stirngFromJNI()對應的C++函數
從上圖可以發現,java中的方法,想要找到自己對應的C++函數,只需要按照如下格式拼接,就能找到對應的C++函數
java_包的全路徑名
Android JNI學習03-AndroidStudio3.6 動手實現一個java調用c++的函數