C代碼回調java方法
-
① 找到字節碼對象
- //jclass (FindClass)(JNIEnv, const char*);
- //第二個參數 要回調的java方法所在的類的路徑 "com/itheima/callbackjava/JNI"
-
② 通過字節碼對象找到方法對象
- //jmethodID (GetMethodID)(JNIEnv, jclass, const char, const char);
- 第二個參數 字節碼對象 第三個參數 要反射調用的java方法名 第四個參數 要反射調用的java方法簽名
- javap -s 要獲取方法簽名的類的全類名 項目/bin/classes 運行javap
-
③ 通過字節碼創建 java對象(可選) 如果本地方法和要回調的java方法在同一個類裏可以直接用 jni傳過來的java對象 調用創建的Method
- jobject obj =(*env)->AllocObject(env,claz);
- 當回調的方法跟本地方法不在一個類裏 需要通過剛創建的字節碼對象手動創建一個java對象
- 再通過這個對象來回調java的方法
- 需要注意的是 如果創建的是一個activity對象 回調的方法還包含上下文 這個方法行不通!!!回報空指針異常
-
④ 反射調用java方法
- //void (CallVoidMethod)(JNIEnv, jobject, jmethodID, ...);
- 第二個參數 調用java方法的對象 第三個參數 要調用的jmethodID對象 可選的參數 調用方法時接收的參數