🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
在Java语言中有几种不同类型的方法。实例方法必须在一个指定的对象实例上调用,而静态方法则可以独立于任何实例被调用。我们暂且将构造函数的相关讨论放到下一个章节讨论。 JNI纸质了一组函数允许你从原生代码中调用。如下的示例程序中,一个原生方法反过来调用了一个Java方法。 ~~~ class InstanceMethodCall { static { System.loadLibrary("InstanceMethodCall"); } private native void nativeMethod(); private void callback() { System.out.println("In Java"); } public static void main(String[] args) { InstanceMethodCall c = new InstanceMethodCall(); c.nativeMethod(); } } ~~~ 如下是原生方法的实现: ~~~ #include <jni.h> #ifdef __cplusplus extern "C" { #endif /* * Class: InstanceMethodCall * Method: nativeMethod * Signature: ()V */ JNIEXPORT void JNICALL Java_InstanceMethodCall_nativeMethod (JNIEnv *env, jobject obj){ jclass cls = (*env)->GetObjectClass(env, obj); jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "()V"); if(!mid) { return; /* method not found */ } printf("In C\n"); (*env)->CallVoidMethod(env, obj, mid); } #ifdef __cplusplus } #endif ~~~ 运行以上程序,你会得到如下输出: ~~~ In C In Java ~~~