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

前言

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

往期回顾

因为这篇的代码也是在原来的DEMO程序下加的,而且前几篇发离现在也有些时间了,所以我就列一下往期的NDK文章

《Android NDK编程(一)---NDK介绍及环境搭建》

《Android NDK编程(二)---CMakeList.txt详解》

《Android NDK编程(三)--- Android调用C的函数》

《Android NDK编程(四)--- C/C++调用Java中的方法》

《Android NDK编程(五)--- C/C++调用Java不同类中的静态方法》

《Android NDK编程(番外篇)--- C/C++中使用LOG输出进行跟踪

JNI中类的传递

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

首先创建我们要传递的类

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;

    //获取产品信息
    public native static CProduct getproduct();

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

生成返回类的步骤:

  1. 用FindClass获取到我们的CProduct类

  2. 用GetFieldID来定义类CProduct里面的属性信息

  3. 实例化我们的类

  4. 通过SetXXXXXField的方法全各个属性赋值

  5. 返回类信息

 

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这个类了,不需要再实例化。

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-

Vaccae的往期经典


OpenCV

《C++ OpenCV案例实战---卡号获取

《C++ OpenCV案例实战---卡片截取(附代码)

《C++ OpenCV透视变换---切换手机正面图片》

《C++ OpenCV实战---获取数量

《C++ OpenCV实战---利用颜色分割获取数量》


Android

《Android利用SurfaceView结合科大讯飞修改语音实别UI

《Android关于语音识别的功能实现分析(一)---结构化思维》

《Android关于语音识别的功能实现分析(二)---语义解析》

《Android根据类生成签名字符串

《Android碎片化布局fragment的实战应用

《Android中RecyclerView嵌套RecyclerView

《Android里用AsyncTask后的接口回调


.Net C#

《C#自定义特性(Attribute)讲解与实际应用

《C#根据类生成签名字符串(附DEMO下载地址)

《C++创建动态库C#调用》

《C#与三菱PLC(型号FX2N)串口通讯类


数据库及其它

《Oracel存储过程写报表实战》

《Delphi轮播视频和图片程序(用于双屏显示程序)

《SQL随机增加销售数据的脚本编写(附脚本下载地址)

《Oracle通过ODBC连接SQL Server数据库


长按下方二维码关注微卡智享

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值