記得第一節(jié)的簡單Demo吧,那是JNI開發(fā)的典型流程,是Java調(diào)用C++的流程,那這一節(jié)我們來看看C++代碼調(diào)用Java方法,我們還是使用上次那個Demo吧。
首先,我們在NDKTest.java中添加兩個靜態(tài)方法,一個方法用于本次測試的入口,一個方法用于提供給C++代碼調(diào)用的,如下圖:

然后我們在C++的代碼文件中加入callJavaInstaceMethod的對應(yīng)方法,如下圖:

在此方法中我們進(jìn)行了對Java方法的調(diào)用。上面這段代碼的關(guān)鍵點我已經(jīng)勾出來了,使用程序首先env->FindClass根據(jù)類名com/iflytek/wcquan/jnitest/NdkTest找到類,然后使用env->GetStaticMethodID類中的找到方法,接著再通過env對象的CallStaticVoidMethod方法來完成最終的調(diào)用過程。
其中,GetStaticMethodID方法的參數(shù)是這樣的:
jmethodID GetStaticMethodID(jclass clazz,const char* name,const char* sig)
第一個參數(shù)是指類,就是要找的哪個類;第二個參數(shù)調(diào)用的方法名,? 參數(shù)三是方法的簽名,例子中其中(Ljava/lang/String;)V是calledByJni方法的簽名。
最后一步,我們在MainActity.java中來調(diào)用了,如下圖:

運行后,我們可以看到

整個C++調(diào)用Java方法的流程就結(jié)束了,后面章節(jié)的內(nèi)容會是原理部分和 深入底層的實現(xiàn)