zoukankan      html  css  js  c++  java
  • 简单的使用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. }  
  • 相关阅读:
    JavaScript表单验证年龄
    PHP会话处理相关函数介绍
    SpringCloud(第一天)
    springboot加强
    SpringBoot的第一个demo
    ElasticSearch(分布式全文搜索引擎)
    Redis集群
    NoSql和Redis
    ElementUI实现CRUD(修改前端页面),前后台解决跨域问题
    SSM+ElementUI综合练习和Swagger和postman的使用(第二天)
  • 原文地址:https://www.cnblogs.com/wangtingyi/p/4628287.html
Copyright © 2011-2022 走看看