Android NDK编程(八)--- JNI中List结构的类数据做为参数

本文承接上一篇Android NDK编程文章,介绍将List结构的类作为参数在方法中实现的内容。实现目标是将JNI生成的List<CProduct>类中每个商品数量加20,阐述了实现思路,给出代码实现步骤,还展示了程序运行效果,最后列举了往期经典文章。

前言

上一篇文章我们介绍了《Android NDK编程(七)--- JNI中List结构的类数据返回》,这章主要介绍把List结构的类做为参数在方法中进行实现。

实现目标

我们用上一章能过JNI生民的LIst<CProduct>类做为参数,把每个一生成的商品数量加上20。

实现思路

  1. 获取ArrayList的引用类

  2. 获取ArrayList里面的get()方法和size()方法,size方法用于判断传入的List总共有多少数据,我们可以做个for循环,get方法用来获取当前位置的CProduct

  3. 获取CProduct的类和类中的qty数量的属性

  4. 得到传入的List的size后进行遍历,针对遍历到的每个object的数量进行加20

代码实现

首先我们在布局文件里面加入一个新的按钮,用于区分原来生成的那个按钮

然后在VaccaeJNI的类中加入我们的修改产品信息方法

按下ALT+ENTER自动在native-lib.cpp中生成方法


写实现方法,根据上面我们写的实现思路,贴出我们的代码

extern "C"
JNIEXPORT void JNICALL
Java_dem_vac_vaccaendk_VaccaeJNI_setlistproduct(JNIEnv *env, jclass type, jobject list) {


    //获取ArrayList类引用
    jclass list_jcls = env->FindClass("java/util/ArrayList");
    if (list_jcls == NULL) {
        LOGI("ArrayList没找到相关类!");
        return;
    }


    //获取ArrayList对象的get()的methodID
    jmethodID list_get = env->GetMethodID(list_jcls, "get", "(I)Ljava/lang/Object;");
    //获取ArrayList对象的size()的methodID
    jmethodID list_size = env->GetMethodID(list_jcls, "size", "()I");
    //然后获取我们的CProduct类的class
    jclass jcls = env->FindClass("dem/vac/vaccaendk/CProduct");
    if (jcls == NULL) {
        return;
    }
    jfieldID qty = env->GetFieldID(jcls, "qty", "I");


    int size= env->CallIntMethod(list,list_size);
    for (int i = 0; i < size; i++) {
        //通过List中的get方法获取到当前的CProduct类
        jobject item=env->CallObjectMethod(list,list_get,i);
        //获取到原来的数量
        int count = env->GetIntField(item,qty);
        //在原数量上加上20
        env->SetIntField(item, qty, count+20);
    }


}

在MainActivity中把按钮2的方法中调用刚才的JNI并显示出数据来


最后我们看一下程序运行后效果

刚打开程序

按下测试按钮后效果

按下测试2的效果

-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随机增加销售数据的脚本编写(附脚本下载地址)

SQL Server中With As的介绍与应用(三)--递归的实战应用

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vaccae

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

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

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

打赏作者

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

抵扣说明:

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

余额充值