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

然后我們?cè)贑++的代碼文件中加入callJavaInstaceMethod的對(duì)應(yīng)方法,如下圖:

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

運(yùn)行后,我們可以看到

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