0x02 Java与JNI(c/c++)函数互调

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 。

    原文作者:lc_fan
    原文地址: https://www.jianshu.com/p/68d499db25dc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞