調用JAVA方法

實例方法的調用
JNI 支持一系列完整的函數讓你能夠在本地代碼中回調 JAVA 方法,下面例子演示瞭如何從本地代碼中調用一個JAVA 中的實例方法:java

複製代碼

class 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(); 
     } 
     static { 
         System.loadLibrary("InstanceMethodCall"); 
     } 
 }

複製代碼

下面的是本地方法的實現:數組

複製代碼

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 == NULL) { 
         return; /* method not found */ 
     } 
     printf("In C\n"); 
     (*env)->CallVoidMethod(env, obj, mid);  //第三步}

複製代碼

除了CallVoidMethod這個函數之外,JNI也支持對返回值爲其它類型的方法的調用。
若是你調用的方法返回值類型爲 int,你的本地方法會使用 CallIntMethod。
相似地,你能夠調用CallObjectMethod 來調用返回值爲 java.lang.String、數組等對象類型的方法。
你也能夠使用 Call<Type>Method 系列的函數來調用接口方法。函數

除了GetObjectClass獲取一個類的應用外,咱們能夠使用 FindClass來獲取一個類的引用,在這裏,咱們能夠學到如何獲取一個
接口的引用。 前面博文有介紹這2個調用的差異。spa

 

靜態方法的調用
調用靜態方法和調用實例方法的 JNI函數有一個很大的不一樣,前者第二個參數是類引用,後者是對象實例的引用。code

在JAVA訪問一個靜態方法能夠經過類,也能夠經過對象實例。而 JNI 的規定是,在本地代碼中回調 JAVA中的靜態方法時,必須指定一個類引用才行。
下面的例子演示了這個用法:對象

複製代碼

class StaticMethodCall { 
     private native void nativeMethod(); 
     private static void callback() { 
         System.out.println("In Java"); 
     } 
     public static void main(String args[]) { 
         StaticMethodCall c = new StaticMethodCall(); 
         c.nativeMethod(); 
     } 
     static { 
         System.loadLibrary("StaticMethodCall"); 
     } 
}

複製代碼

下面是本地方法的實現:接口

複製代碼

JNIEXPORT void JNICALL  Java_StaticMethodCall_nativeMethod(JNIEnv *env, jobject obj) 
 { 
     jclass cls = (*env)->GetObjectClass(env, obj); 
     jmethodID mid =  
         (*env)->GetStaticMethodID(env, cls, "callback", "()V"); 
     if (mid == NULL) { 
         return;  /* method not found */ 
     } 
     printf("In C\n"); 
     (*env)->CallStaticVoidMethod(env, cls, mid); //注意這裏傳入的是類引用 cls而不是對象引用obj}

複製代碼

相關文章
相關標籤/搜索