步骤:
1.通过类名获取jclass对象
2.通过jclass对象拿到jmethodId
3.通过JNIEnv*对象调用jmethodId对象
- JNIEXPORT void JNICALL Java_com_vincent_jni_callback_JNI_1dataprovider_sayHello
- (JNIEnv *env, jobject obj, jstring str){
- //1.通过反射拿到 class
- // jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
- //env :jni指针对象 ,"com/vincent/jni/callback/JNI_dataprovider" 类全名
- jclass clazz =(*env)->FindClass(env,"com/vincent/jni/callback/JNI_dataprovider");
- if(clazz==0){
- LOGI("find class error");
- return;
- }
- //2.拿到相应方法的methodID
- // jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
- LOGI("find class success");
- // env,clazz(java对象),方法名,方法签名(javap获取)
- jmethodID methoID = (*env)->GetMethodID(env,clazz,"javaSayHello","(Ljava/lang/String;)V");
- //3.调用方法
- // void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
- (*env)->CallVoidMethod(env,obj,methoID,str);
- }
- JNIEXPORT jint JNICALL Java_com_vincent_jni_callback_JNI_1dataprovider_subXAndY(
- JNIEnv * env, jobject obj, jint x, jint y) {
- //1.通过反射拿到 class
- // jclass (*FindClass)(JNIEnv*, const char*);
- jclass clazz2 = (*env)->FindClass(env,
- "com/vincent/jni/callback/JNI_dataprovider");
- if (clazz2 == 0) {
- LOGI("find class error");
- return 0;
- }
- //2.拿到相应方法的methodID
- // jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
- LOGI("find class success");
- jmethodID methoID2 = (*env)->GetMethodID(env, clazz2, "javaSubXAndY", "(II)I");
- //3.调用方法
- // jint (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);;
- return (*env)->CallIntMethod(env, obj, methoID2, x, y);
- }
















