JNI基礎(七)C調java靜態方法程式碼
阿新 • • 發佈:2019-02-17
上次記錄了一下如何呼叫java程式碼,但是java方法有靜態與非靜態之分,所以呼叫方式也是不一樣的。
java程式碼:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final JNI jni = new JNI(); final int[] arr = {1,2,3,4,5}; ((Button) findViewById(R.id.bt_fuck)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { jni.cinovkejavashow(); } }); } public static void show(){ Log.i("mydata","呵呵,我靜態方法被呼叫了"); } }
public class JNI {
/**
* 載入動態連結庫
* 也就是c程式碼編譯好的so檔案
*/
static {
System.loadLibrary("app");
}
public native void cinovkejavashow();
}
C程式碼:
/* * Class: com_example_jnidemo_JNI * Method: cinovkejavashow * Signature: ()V */ JNIEXPORT void JNICALL Java_com_example_jnidemo_JNI_cinovkejavashow (JNIEnv *env, jobject obj){ //通過反射獲取到類 jclass jclazz = (*env)->FindClass(env,"com/example/jnidemo/MainActivity"); //通過反射獲取到方法 /** * 第一個引數:虛擬機器指標 * 第二個引數:方法所在class * 第三個引數:方法名 * 第四個引數:方法簽名(javap -s class全類名(位元組碼的全類名)) */ jmethodID jmethod = (*env)->GetStaticMethodID(env,jclazz,"show","()V"); //呼叫方法 /** * 第一個引數:java虛擬機器 * 第二個引數:呼叫此方法的類 * 第三個引數:jmethodID */ (*env)->CallStaticVoidMethod(env,jclazz,jmethod); }
重點一:和Java反射呼叫一樣,呼叫靜態方法的話,就不需要例項,直接class.方法名就可以了。
重點二:jni語法中都有對應的獲取static方法的相關函式,注意與非靜態呼叫之間的區別。