简单的使用jni调用java方法

jni中调用Java方法分几步。

1、先使用FindClass方法获取指定类class;

2、在使用GetStaticMethodID方法或者GetMethodID获取静态和非静态的方法id。

3、在使用CallObjectMethod或者CallStaticObjectMethod方法调用静态非静态方法,对于没有返回值的方法,函数为CallStaticVoidMethod形式。

jobject zoomImage(JNIEnv* env, jobject jimgo, jint width, jint height, jint hints)  
{  
    /* 声明局部变量 */  
    jobject zoomimage;  
    jmethodID jmgsi;  
    jclass jimagec;  
  
    /* 查找指定名称类 */  
    jimagec = (*env)->FindClass(env, "java/awt/Image");  
  
    /* 
        获取方法id 
        (III)Ljava/awt/Image;为方法参数和返回值类型 
        (III)表示此方法参数为int,int,int三个参数。返回值为Ljava/awt/Image 
    */  
    jmgsi = (*env)->GetMethodID(env, jimagec, "getScaledInstance", "(III)Ljava/awt/Image;");  
    zoomimage = (*env)->CallObjectMethod(env, jimgo, jmgsi, width, height, hints);  
    return zoomimage;  
}  
  
jobject getImage(JNIEnv* env, jbyteArray buf)  
{  
    /* 声明局部变量 */  
    jclass jcls;  
    jmethodID jmid;  
    jmethodID jcreateimage;  
    jobject jtk;  
    jobject jimgo;  
  
    /* 
        FindClass函数用于查找java类,参数为类的包名形式,不过.换成了/。 
        java.awt.Toolkit 对应java/awt/Toolkit 
    */  
    jcls = (*env)->FindClass(env, "java/awt/Toolkit");  
    if (jcls == NULL) {  
        return NULL;  
    }  
    /* 
        查找静态方法id。 
        第二个参数为查找方法的类class, 
        第三个参数为查找方法名称, 
        第三个参数为方法参数和返回值类型。 
        java中方法 public static Toolkit getDefaultToolkit() 
        对应的参数和方法类型为()Ljava/awt/Toolkit; 
        ()表示此方法没有参数,Ljava/awt/Toolkit为返回值类型,记住前面的L和结尾; 
    */  
    jmid = (*env)->GetStaticMethodID(env, jcls, "getDefaultToolkit", "()Ljava/awt/Toolkit;");  
  
    /* 
        调用静态方法,返回类型为Object。 
        参数分别为:指定方法的class和获取的方法id 
    */  
    jtk = (*env)->CallStaticObjectMethod(env, jcls, jmid);  
  
    /* 
        获取非静态方法id 
        使用和静态一样,注意这里参数类型:([B)Ljava/awt/Image; 
        ([B)表示此方法的参数类型为byte[]数组,具体参数对应类型可以查找sun的jni手册 
    */  
    jcreateimage = (*env)->GetMethodID(env, jcls, "createImage", "([B)Ljava/awt/Image;");  
  
    /* 
        调用非静态方法,并返回Obiect对象,最后一个参数为可变参数,对应值为 
        方法的参数列表。 
     */  
    jimgo = (*env)->CallObjectMethod(env, jtk, jcreateimage, buf);  
  
    /* 释放局部对象*/  
    (*env)->DeleteLocalRef(env, jtk);  
    return jimgo;  
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值