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);
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容