1. 程式人生 > >JNI基礎(七)C調java靜態方法程式碼

JNI基礎(七)C調java靜態方法程式碼

上次記錄了一下如何呼叫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方法的相關函式,注意與非靜態呼叫之間的區別。