Android JNI學習02-AndroidStudio3.6JNI示例demo講解

請看第一個步驟,當執行到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++的函數

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章