主要是利用反射的原理
C语言回调java方法 java代码开发好了 一个方法 C会掉java代码
javap -s 打印方法的签名 注意要cd到 C:\workspace\HelloWorldFromC2\bin\classes 传全类名通过反射 调用java代码
Class<?> forName = Class.forName("com.example.ndkcallback.DataProvider");
Method declaredMethod = forName.getDeclaredMethod("helloFromJava", new Class[]{});
declaredMethod.invoke(forName.newInstance(), new Object[]{});
///jclass (*FindClass)(JNIEnv*, const char*);
jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider"); //参数为 env 和 全类名 (需要调用的java方法所在的类)
// jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
// 方法签名 参数和返回值
jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V"); //参数为 env jclass 方法名 和方法签名(通过到bin/class目录下 javap -s 全类名) 得到
// void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env,jobject,methodId); //参数为 env 调用的对象 如果 要调用的java方法 和 native方法 不在一个目录下 那么使用
jobject (*AllocObject)(JNIEnv*, jclass); jobject obj=(*env)->AllocObject(env,clazz); // new MainActivity();作为参数
//最后一个参数是 方法 id
//如果调用的是 静态方法 下述 即可 主要是多了个static
JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod5
(JNIEnv * env, jobject j){
jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");
// jmethodID (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID methodid=(*env)->GetStaticMethodID(env,clazz,"demo","()V");
//void (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
(*env)->CallStaticVoidMethod(env,clazz,methodid);
}