您好,登錄后才能下訂單哦!
本篇內容主要講解“ C/C++怎么調用Java不同類中的靜態方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“ C/C++怎么調用Java不同類中的靜態方法”吧!
前言
上一篇我們介紹了《Android NDK編程(四)--- C/C++調用Java中的方法》,主要是C/C++中調用Java的方法,這一篇我們針對上一篇的內容再延伸說一下,關于調不同類中的靜態方法。
代碼演示
我們繼續接著原來的Demo程序進行處理,首先我們先新建一個類名為VaccaeJNI,然后在這個類里面增加一個native的靜態方法。
通過ALT+ENTER在native-lib.cpp中增加了對應的方法函數,然后寫實現方法。
最后再我們的按鈕事件里調用VaccaeJNI類中的靜態方法
運行結果
上面來說我們從java調C/C++的方法其實基本都差不多,下面我們重點要說一下C/C++調用java的方法。
我們在VaccaeJNI中加入一個native的靜態方法和一個本地的靜態方法。
然后再對應的C++文件中寫入實現方法
從上圖我們可以看到,調用靜態方法的時候我們的GetMethodID和CallMethod方法都加上了static變為GetStaticMethodID和CallStaticIntMethod,如果這里不改變的話,調用時就會報錯了。
在按鈕事件中我們再寫實現方法
相對來說調用靜態方法還是比較簡單的,我們看一下運行結果
調用不同類中的方法
最后我們要說一下重點,因為我們在寫方法的時候可能會調用的是不同類里面的方法,導航native的方法和要調用的java方法不在同一個類里,遇到這樣的方法我們來看一看怎么實現。
我們還是在VaccaeJNI的類中寫一個非靜態的方法,兩個數相乘
然后調用的native的函數,我們直接寫在Mainactivity.java中
上圖中我們先定義了一個plusFromJNI的參數,輸入兩個值得到返回數,然后先把按鈕事件寫了調用方法,接下來我們按ALT+ENTER在C++的文件中生成方法
native-lib.cpp
extern "C"
JNIEXPORT jint JNICALL
Java_dem_vac_vaccaendk_MainActivity_plusFromJNI(JNIEnv *env, jobject instance, jint a, jint b) {
//首先獲取class,這里傳入的參數jobject是代表了Mainactivity,所以我們要自己查找
jclass jcls=env->FindClass("dem/vac/vaccaendk/VaccaeJNI");
if (jcls == NULL) {
return 0;
}
//獲取方法
jmethodID jmethod = env->GetMethodID(jcls, "Plus", "(II)I");
if(jmethod==NULL) {
return 0;
}
//調用訪法
//第一個參數為jobject的這是傳入的是jobject是Mainactivity,
//如果在CallIntMethod里面直接用傳入的肯定會出錯,因為我們的
//方法是在VaccaeJNI的類里面,所以我們首先要實例化那個類,再調用
jobject jobj = env->AllocObject(jcls);
return env->CallIntMethod(jobj,jmethod,a,b);
}
上面代碼中我們主要要關注幾個我寫了注釋的地方,如下圖
最后我們再運行一下程序,看看結果
到此,相信大家對“ C/C++怎么調用Java不同類中的靜態方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。