简单的使用jni调用java方法

jni中调用java方法分几步。先使用FindClass方法获取指定类class,在使用GetStaticMethodID方法或者GetMethodID获取静态和非静态的方法id。在使用CallObjectMethod或者CallStaticObjectMethod方法调用静态非静态方法,对于没有返回值的方法,函数为CallStaticVoidMethod形式。

 

 

[cpp] view plaincopy
 
  1. jobject zoomImage(JNIEnv* env, jobject jimgo, jint width, jint height, jint hints)  
  2. {  
  3.     /* 声明局部变量 */  
  4.     jobject zoomimage;  
  5.     jmethodID jmgsi;  
  6.     jclass jimagec;  
  7.   
  8.     /* 查找指定名称类 */  
  9.     jimagec = (*env)->FindClass(env, "java/awt/Image");  
  10.   
  11.     /* 
  12.         获取方法id 
  13.         (III)Ljava/awt/Image;为方法参数和返回值类型 
  14.         (III)表示此方法参数为int,int,int三个参数。返回值为Ljava/awt/Image 
  15.     */  
  16.     jmgsi = (*env)->GetMethodID(env, jimagec, "getScaledInstance", "(III)Ljava/awt/Image;");  
  17.     zoomimage = (*env)->CallObjectMethod(env, jimgo, jmgsi, width, height, hints);  
  18.     return zoomimage;  
  19. }  
  20.   
  21. jobject getImage(JNIEnv* env, jbyteArray buf)  
  22. {  
  23.     /* 声明局部变量 */  
  24.     jclass jcls;  
  25.     jmethodID jmid;  
  26.     jmethodID jcreateimage;  
  27.     jobject jtk;  
  28.     jobject jimgo;  
  29.   
  30.     /* 
  31.         FindClass函数用于查找java类,参数为类的包名形式,不过.换成了/。 
  32.         java.awt.Toolkit 对应java/awt/Toolkit 
  33.     */  
  34.     jcls = (*env)->FindClass(env, "java/awt/Toolkit");  
  35.     if (jcls == NULL) {  
  36.         return NULL;  
  37.     }  
  38.     /* 
  39.         查找静态方法id。 
  40.         第二个参数为查找方法的类class, 
  41.         第三个参数为查找方法名称, 
  42.         第三个参数为方法参数和返回值类型。 
  43.         java中方法 public static Toolkit getDefaultToolkit() 
  44.         对应的参数和方法类型为()Ljava/awt/Toolkit; 
  45.         ()表示此方法没有参数,Ljava/awt/Toolkit为返回值类型,记住前面的L和结尾; 
  46.     */  
  47.     jmid = (*env)->GetStaticMethodID(env, jcls, "getDefaultToolkit", "()Ljava/awt/Toolkit;");  
  48.   
  49.     /* 
  50.         调用静态方法,返回类型为Object。 
  51.         参数分别为:指定方法的class和获取的方法id 
  52.     */  
  53.     jtk = (*env)->CallStaticObjectMethod(env, jcls, jmid);  
  54.   
  55.     /* 
  56.         获取非静态方法id 
  57.         使用和静态一样,注意这里参数类型:([B)Ljava/awt/Image; 
  58.         ([B)表示此方法的参数类型为byte[]数组,具体参数对应类型可以查找sun的jni手册 
  59.     */  
  60.     jcreateimage = (*env)->GetMethodID(env, jcls, "createImage", "([B)Ljava/awt/Image;");  
  61.   
  62.     /* 
  63.         调用非静态方法,并返回Obiect对象,最后一个参数为可变参数,对应值为 
  64.         方法的参数列表。 
  65.      */  
  66.     jimgo = (*env)->CallObjectMethod(env, jtk, jcreateimage, buf);  
  67.   
  68.     /* 释放局部对象*/  
  69.     (*env)->DeleteLocalRef(env, jtk);  
  70.     return jimgo;  
  71. }  
posted @ 2015-07-07 18:55  年少初成  阅读(771)  评论(0编辑  收藏  举报