Java調(diào)用C方法
很簡單 崎逃,只需要編寫native方法即可 , 通過C去調(diào)用Java的字段與方法 .
public class JniUtil{
public native void getId();
public static native void getData(long unixTime);
}
C調(diào)用的Java字段與方法
STEP1: 得到j(luò)class
非靜態(tài)方法調(diào)用
即以對(duì)像方法調(diào)用native函數(shù), jni函數(shù)傳入的值為JNIEnv結(jié)構(gòu)體指針和調(diào)用方法的對(duì)象(JNIEnv *env, jobject obj)。
利用JNIEnv方法GetObjectClass,從對(duì)象中獲取類碧注。
案例接上文JniUtil定義:
java
JniUtil jniUtil = new JniUtil();
jniUtil.getId();
JNI(C++)
void getId_jni(JNIEnv *env, jobject jobj) {
jclass cls = env->GetObjectClass(jobj);//獲得了jclass
/*code*/
}
靜態(tài)方法調(diào)用
即以static 修飾該native函數(shù), jni函數(shù)傳入的值為JNIEnv結(jié)構(gòu)體指針和調(diào)用方法的類(JNIEnv *env, jclass cls)糖赔。
可以直接利用傳入的類萍丐。
案例接上文JniUtil定義:
java
JniUtil.getData(System.currentTimeMillis());
JNI(C++)
void getId_jni(JNIEnv *env, jclass cls) {
/*code*/ //直接使用 jclass cls
}
STEP2: 得到字段或方法ID ,
區(qū)分靜態(tài)字段與對(duì)象字段 , 靜態(tài)字段或方法調(diào)用(env)->GetStaticFieldID放典,(env)->GetMethodID函數(shù)得到ID 逝变, 對(duì)象字段調(diào)用(env)->GetFieldID,(env)->GetStaticMethodID得到ID 奋构。 可以得到一個(gè)套路 壳影, 靜態(tài)修飾的 , 則調(diào)用static標(biāo)識(shí)的函數(shù) 弥臼, 非靜態(tài)的則調(diào)用常規(guī)函數(shù) 宴咧。
STEP3: 取得字段的值或調(diào)用方法
需要注意的是, 得到字段的值與調(diào)用方法 径缅, 都有類型的區(qū)分 掺栅。引用類型則使用GetObjectField烙肺, CallStaticObjectMethod, 其他類型 氧卧, 則有對(duì)于的jxxx類型對(duì)應(yīng) 桃笙。套路簡寫:GetField, GetStaticField沙绝, CallMethod搏明, CallStaticMethod 。