前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android NDK编程(六)--- JNI中类参数的传递与返回

Android NDK编程(六)--- JNI中类参数的传递与返回

作者头像
Vaccae
发布2019-07-24 14:01:57
1.4K0
发布2019-07-24 14:01:57
举报
文章被收录于专栏:微卡智享微卡智享

前言

代码往往在不断写的情况下学习到新的东西,本以为NDK程序这块出完番外篇后应该就不用再出了,结果在使用过程中还是会有新的东西加入,所以又有了今天这一篇。

JNI中类的传递

上面说了一大篇,正篇我们马上开始。

首先创建我们要传递的类

代码语言:javascript
复制
public class CProduct {

    public CProduct() {
        incode="";
        fname="";
        price=0;
        qty=0;
    }

    //商品编码
    public String incode;
    //商品名称
    public String fname;
    //价格
    public float price;
    //数量
    public int qty;
}

从JNI中得到返回类的信息

我们在VaccaeJNI的类中加入一个静态方法getproduct;

代码语言:javascript
复制
    //获取产品信息    
    public native static CProduct getproduct();

然后按ALT+ENTER让其在native-lib.cpp中自动生成对应的方法

生成返回类的步骤:

  1. 用FindClass获取到我们的CProduct类
  2. 用GetFieldID来定义类CProduct里面的属性信息
  3. 实例化我们的类
  4. 通过SetXXXXXField的方法全各个属性赋值
  5. 返回类信息
代码语言:javascript
复制
extern "C"
JNIEXPORT jobject JNICALL
Java_dem_vac_vaccaendk_VaccaeJNI_getproduct(JNIEnv *env, jclass type) {

    //首先获取class
    jclass jcls = env->FindClass("dem/vac/vaccaendk/CProduct");
    if (jcls == NULL) {
        return 0;
    }

    //定义类里面的属性
    jfieldID incode = env->GetFieldID(jcls, "incode", "Ljava/lang/String;");
    jfieldID fname = env->GetFieldID(jcls, "fname", "Ljava/lang/String;");
    jfieldID price = env->GetFieldID(jcls, "price", "F");
    jfieldID qty = env->GetFieldID(jcls, "qty", "I");

    //首先实例化类
    jobject jobj = env->AllocObject(jcls);
    //然后对类中的各属性赋值
    //商品编码
    env->SetObjectField(jobj, incode, env->NewStringUTF("000001"));
    //商品名称
    env->SetObjectField(jobj, fname, env->NewStringUTF("康师傅方便面"));
    //价格
    env->SetFloatField(jobj, price, 6.5);
    //数量
    env->SetIntField(jobj, qty, 10);

    //输出
    return jobj;

}

然后我们在按钮事件里面写入调用的这个方法并显示出来

看一下运行效果


将类做为参数进行修改

首先增加参数

然后还是按ALT+ENTER生成JNI中的方法

操作步骤:

  1. 用FindClass获取到我们的CProduct类
  2. 用GetFieldID来定义类CProduct里面的属性信息
  3. 通过SetXXXXXField的方法全各个属性赋值
  4. 返回类信息

从上面的步骤我们看到,比刚才直接生成类少了一步,这是因为我们参数传递进来的已经有CProduct这个类了,不需要再实例化。

代码语言:javascript
复制
extern "C"
JNIEXPORT jobject JNICALL
Java_dem_vac_vaccaendk_VaccaeJNI_updateproduct(JNIEnv *env, jclass type, jobject prd) {

    //首先获取class
    jclass jcls = env->FindClass("dem/vac/vaccaendk/CProduct");
    if (jcls == NULL) {
        return 0;
    }

    //定义类里面的属性
    jfieldID incode = env->GetFieldID(jcls, "incode", "Ljava/lang/String;");
    jfieldID fname = env->GetFieldID(jcls, "fname", "Ljava/lang/String;");
    jfieldID price = env->GetFieldID(jcls, "price", "F");
    jfieldID qty = env->GetFieldID(jcls, "qty", "I");


    //然后对类中的各属性赋值
    //商品编码
    env->SetObjectField(prd, incode, env->NewStringUTF("000002"));
    //商品名称
    env->SetObjectField(prd, fname, env->NewStringUTF("康师傅冰红茶"));
    //价格
    env->SetFloatField(prd, price, 4.7);
    //数量
    env->SetIntField(prd, qty, 15);

    //输出
    return prd;

}

然后在按钮事件中加入调用这个的代码

最后我们再看一下显示结果

-END-

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档