0x02 Java与JNI(c/c++)函数互调
2018-03-20 本文已影响102人
lc_fan
Java调用C方法
很简单 ,只需要编写native方法即可 , 通过C去调用Java的字段与方法 .
public class JniUtil{
public native void getId();
public static native void getData(long unixTime);
}
C调用的Java字段与方法
STEP1: 得到jclass
非静态方法调用
即以对像方法调用native函数, jni函数传入的值为JNIEnv结构体指针和调用方法的对象(JNIEnv *env, jobject obj)。
利用JNIEnv方法GetObjectClass,从对象中获取类。
案例接上文JniUtil定义:
java
JniUtil jniUtil = new JniUtil();
jniUtil.getId();
JNI(C++)
void getId_jni(JNIEnv *env, jobject jobj) {
jclass cls = env->GetObjectClass(jobj);//获得了jclass
/*code*/
}
静态方法调用
即以static 修饰该native函数, jni函数传入的值为JNIEnv结构体指针和调用方法的类(JNIEnv *env, jclass cls)。
可以直接利用传入的类。
案例接上文JniUtil定义:
java
JniUtil.getData(System.currentTimeMillis());
JNI(C++)
void getId_jni(JNIEnv *env, jclass cls) {
/*code*/ //直接使用 jclass cls
}
STEP2: 得到字段或方法ID ,
区分静态字段与对象字段 , 静态字段或方法调用(env)->GetStaticFieldID,(env)->GetMethodID函数得到ID , 对象字段调用(env)->GetFieldID,(env)->GetStaticMethodID得到ID 。 可以得到一个套路 , 静态修饰的 , 则调用static标识的函数 , 非静态的则调用常规函数 。
STEP3: 取得字段的值或调用方法
需要注意的是, 得到字段的值与调用方法 , 都有类型的区分 。引用类型则使用GetObjectField, CallStaticObjectMethod, 其他类型 , 则有对于的jxxx类型对应 。套路简写:GetField, GetStaticField, CallMethod, CallStaticMethod 。