jni 下调用java 的方法;
1. 获取方法参数的签名
使用 javap -p -s xxx 获取
有可能会出现找不到类 , 可以先使用javac 命令编译成class文件
可以得到方法参数的签名
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);
}