前言
上一篇文章我们介绍了《Android NDK编程(七)--- JNI中List结构的类数据返回》,这章主要介绍把List结构的类做为参数在方法中进行实现。
实现目标
我们用上一章能过JNI生民的LIst<CProduct>类做为参数,把每个一生成的商品数量加上20。
实现思路
获取ArrayList的引用类
获取ArrayList里面的get()方法和size()方法,size方法用于判断传入的List总共有多少数据,我们可以做个for循环,get方法用来获取当前位置的CProduct
获取CProduct的类和类中的qty数量的属性
得到传入的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
Android
《Android利用SurfaceView结合科大讯飞修改语音实别UI》
《Android关于语音识别的功能实现分析(一)---结构化思维》
《Android关于语音识别的功能实现分析(二)---语义解析》
《Android中RecyclerView嵌套RecyclerView》
.Net C#
数据库及其它
《SQL Server中With As的介绍与应用(三)--递归的实战应用》
长按下方二维码关注微卡智享

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

被折叠的 条评论
为什么被折叠?



