2020-04-23 JNI- 调用java 方法

jni 下调用java 的方法;

1. 获取方法参数的签名

使用 javap -p -s xxx 获取
有可能会出现找不到类 , 可以先使用javac 命令编译成class文件


WechatIMG87.png

可以得到方法参数的签名

2.调用java 中的方法

extern "C"
JNIEXPORT void JNICALL
//最后一个参数,如果使用的是static 方法,则为jclass
Java_com_qschou_testcalljava_CallJava_callJava(JNIEnv *env, jobject thiz) {
    //3 -> 获取jclass
    jclass j_class = env->GetObjectClass(thiz);
    //2 -> 获取成员变量的id 第二个参数为变量名 第三个参数为变量签名
    jfieldID j_field = env->GetFieldID(j_class, "name", "Ljava/lang/String;");
    //1 -> 获取成员变量
    jstring j_string = (jstring) env->GetObjectField(thiz, j_field);
    //4 -> 将获取到java的 string 类型转成c可以使用的char 类型
    const char *c = env->GetStringUTFChars(j_string, NULL);

    LOGE("获取字符->%s", c);

    jstring return_str = env->NewStringUTF("hello word");
    // 5 -> 修改java 中的成员变量
    env->SetObjectField(thiz, j_field, return_str);
    // 2-1 -> 获取静态成员变量的方法
    j_field = env->GetStaticFieldID(j_class, "age", "I");
    jint age = env->GetStaticIntField(j_class, j_field);
    LOGE("获取age->%d", age);
    age += 12;
    env->SetStaticIntField(j_class, j_field, age);

    //3-2 -> 获取方法ID , 第二个参数为方法名,第三个参数为方法签名
    jmethodID j_methodId = env->GetMethodID(j_class, "add", "(II)I");
    //3-1 -> 调用java 中的方法
    jint reslut = env->CallIntMethod(thiz, j_methodId, 2, 3);
    LOGE("调用方法->%d", reslut);

    j_methodId = env->GetMethodID(j_class, "getUUID", "()Ljava/lang/String;");
    jstring uuid = (jstring) env->CallObjectMethod(thiz, j_methodId);
    const char *c_uuid = env->GetStringUTFChars(uuid, NULL);
    LOGE("调用方法获取uuid->%s", c_uuid);
}

你可能感兴趣的:(2020-04-23 JNI- 调用java 方法)