原理是使用反射的机制
java中反射的例子:
Class<?> forName = Class.forName("com.example.ndkcallback.DataProvider"); //找到类 Method declaredMethod = forName.getDeclaredMethod("helloFromJava", new Class[]{}); //找到类的方法 declaredMethod.invoke(forName.newInstance(), new Object[]{}); //执行类的方法
c语言也是一样的用反射的机制:
///jclass (*FindClass)(JNIEnv*, const char*); jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider"); // jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*); // 方法签名 参数和返回值 jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V"); // void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); (*env)->CallVoidMethod(env,jobject,methodId);
得到方法签名的方法:
进入工厂classes目录下:
C:UserszyDesktopworkspacejniTestinclasses>javap -s 类的全路径
这样得到方法签名